在OpenGL中绘制具有极坐标的正方形

时间:2014-06-08 13:58:47

标签: c++ opengl math programming-languages opengl-3

如何在OpenGL中绘制一个带有极坐标的正方形?

我知道这些等式:

 x = r * cos ( theta ) 
 y = r * sin ( theta )
 r = n * cos ( theta )

我的代码:

float baseX = width / 2.f; 
float baseY = height / 2.f
int n = 7;
glBegin(GL_POINTS);{
    for (float tempAngle = 0.0 ; tempAngle <= PI/4 ; tempAngle++) {
        radius = n * cos(PI/4);
        x = baseX + radius * cos(tempAngle);
        y = baseY + radius * sin(tempAngle);
        glVertex2f(x, y);
    }
}glEnd();

3 个答案:

答案 0 :(得分:1)

我希望我们都意识到这是一个纯粹的理论练习,并不是用OpenGL绘制正方形的合理方法。但我觉得这可能很有趣,所以我们走了。

我不认为你的公式是正确的。在坐标系中绘制正方形的右侧,坐标系是x = 1.0处的垂直线。然后,如果您查看该行上给定点的原点的距离,则根据theta,您会看到:

cos(theta) = 1.0 / r

这极快地导致极坐标系中正方形的值r

r = 1.0 / cos(theta)

基于此,这里是使用极坐标绘制正方形的代码。 side2是广场边长的一半:

const float PI_F = static_cast<float>(M_PI);
const unsigned DIV_COUNT = 10;
const float ANG_INC = 0.5f * PI_F / static_cast<float>(DIV_COUNT);

glBegin(GL_LINE_LOOP);

for (unsigned iDiv = 0; iDiv < DIV_COUNT; ++iDiv)
{
    float ang = -0.25f * PI_F + static_cast<float>(iDiv) * ANG_INC;
    float r = side2 / cos(ang);
    glVertex2f(r * cos(ang), r * sin(ang));
}

for (unsigned iDiv = 0; iDiv < DIV_COUNT; ++iDiv)
{
    float ang = -0.25f * PI_F + static_cast<float>(iDiv) * ANG_INC;
    float r = side2 / cos(ang);
    glVertex2f(r * -sin(ang), r * cos(ang));
}

for (unsigned iDiv = 0; iDiv < DIV_COUNT; ++iDiv)
{
    float ang = -0.25f * PI_F + static_cast<float>(iDiv) * ANG_INC;
    float r = side2 / cos(ang);
    glVertex2f(r * -cos(ang), r * -sin(ang));
}

for (unsigned iDiv = 0; iDiv < DIV_COUNT; ++iDiv)
{
    float ang = -0.25f * PI_F + static_cast<float>(iDiv) * ANG_INC;
    float r = side2 / cos(ang);
    glVertex2f(r * sin(ang), r * -cos(ang));
}

glEnd();

答案 1 :(得分:0)

我不确定你的问题是什么意思。正方形有四个角,绘制时对应四个顶点。固定函数OpenGL使用笛卡尔坐标(它实现了一个顶点着色器,可以摄取极坐标或球面坐标并正确转换为笛卡尔剪辑空间)。

那么究竟是什么问题。我只能看到一种有意义的解释这个问题的方法:&#34;极坐标中方形角的坐标是什么?&#34; 但是我不知道看看你如何将它与心理模型中的OpenGL联系起来。

答案 2 :(得分:0)

我找到了解决方案。

int n = 70;
int i = 1;
glBegin(GL_TRIANGLE_FAN);{
    for (float tempAngle = 0.0 ; tempAngle <= 2 * PI ; tempAngle += PI/8) {
        radius = n * cos(tempAngle);
        x = baseX + radius * cos(tempAngle);
        y = baseY + radius * sin(tempAngle);
        if (i % 2 == 0)
            glVertex2f(x, y);
        i++;
    }
}glEnd();