【问题标题】:C++ Badly written function, don't know how to simplify it [beginner]C++写得不好的函数,不知道怎么简化[初学者]
【发布时间】:2023-03-19 15:31:02
【问题描述】:

所以我对 C++ 还是很陌生,我现在正在 uni 上学习它。

我开始使用 openGL,我目前正在制作不同的形状和对象以显示在屏幕上,除了一个功能外,它运行良好:

void Shape::drawRandom(void) {

glEnable(GL_POINT_SMOOTH);
glPointSize(5.0);
glColor3ub(255, 0, 0);
glBegin(GL_POINTS);

//v1
float x1 = rand_FloatRange(-0.75, 0.75);
float y2 = rand_FloatRange(-0.75, 0.75);
glVertex2f(x1, y2);

//v2
float x3 = rand_FloatRange(-0.75, 0.75);
float y4 = rand_FloatRange(-0.75, 0.75);
glVertex2f(x3, y4);

//v3
float x5 = rand_FloatRange(-0.75, 0.75);
float y6 = rand_FloatRange(-0.75, 0.75);
glVertex2f(x5, y6);

//v4
float x7 = rand_FloatRange(-0.75, 0.75);
float y8 = rand_FloatRange(-0.75, 0.75);
glVertex2f(x7, y8);

glEnd();
}

基本上,此函数获取两个随机浮点值(在不同的函数中生成),并将它们设置为顶点(点)的 x any y 值并显示它们。

基本上在屏幕上用随机坐标绘制 4 个点。

但我觉得它非常多余,每对坐标的代码几乎相同,并且可能会被简化。

我试图用循环来做,但我失败了,我现在很好奇如何让这个更简单,更少冗余

【问题讨论】:

  • 我想看看您对循环的尝试,以便我们帮助您更好地理解它们。因为循环是要走的路,而且你已经弄清楚了那部分。

标签: c++ function opengl methods


【解决方案1】:

你能在这里填空,让 for 循环恰好运行四次吗?

void Shape::drawRandom(void) {

  glEnable(GL_POINT_SMOOTH);
  glPointSize(5.0);
  glColor3ub(255, 0, 0);
  glBegin(GL_POINTS);

 for(__________________) {
    float x = rand_FloatRange(-0.75, 0.75);
    float y = rand_FloatRange(-0.75, 0.75);
    glVertex2f(x, y);
 }

 glEnd();
}

【讨论】:

  • 哦,我明白我做错了什么。出于某种原因,我包括 glEnd();在循环中,这就是为什么我看不到屏幕上出现任何点的原因。现在效果很好,非常感谢!
  • @Macko,感谢您接受我的回答。祝你有美好的一天!
【解决方案2】:

也许是这样的?

void Shape::drawRandom(void)
{
    glEnable(GL_POINT_SMOOTH);
    glPointSize(5.0);
    glColor3ub(255, 0, 0);
    glBegin(GL_POINTS);

    for (int i = 0; i < 4; i++)
        glVertex2f(rand_FloatRange(-0.75, 0.75), rand_FloatRange(-0.75, 0.75));

    glEnd();
}

【讨论】:

    【解决方案3】:

    我想到的第一件事就是重用变量。不是每次都声明两个变量,而是每次都覆盖它们。但是,还有更好的方法。您可以在对glVertex2f(x, y) 的调用中直接使用rand_FloatRange(-0.75, 0.75),使其看起来像这样

    glVertex2f(rand_FloatRange(-0.75, 0.75), rand_FloatRange(-0.75, 0.75))
    

    函数的计算与数学函数非常相似。我的意思是,在这种情况下,括号内的东西首先被评估。这里调用rand_FloatRange(a,b) 并且该函数返回它应该的。这两个调用在通过之前都会发生。然后这些函数返回的值作为 glVertex2f(x,y) 的参数传递,其中 x 和 y 是返回的数字。这完全绕过了将值存储在变量中的需要,因为它们会立即使用。现在你说的for循环也很简单了。

    for (int i = 0; i < 4; i++) {
        glVertex2f(rand_FloatRange(-0.75, 0.75), rand_FloatRange(-0.75, 0.75));
    }
    

    这在 C++ 世界和整个编程世界中都很常见。如果您想制作更多或更少的随机点,只需将循环控制变量从 4 更改为您想要的点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-18
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多