在OpenGL中用极坐标绘制正方形

Posted

技术标签:

【中文标题】在OpenGL中用极坐标绘制正方形【英文标题】:Draw Square With Polar Coordinates in OpenGL 【发布时间】:2014-06-08 13:58:46 【问题描述】:

如何在 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();

【问题讨论】:

这些方程只有在你从它们中精确采样四个点时才会创建一个球体,每个点的角度距离为 PI/2。您渲染的是位于球弧段上的一系列点。我不知道你在这里试图达到什么目的,但在这里使用极坐标似乎毫无意义。 @derhass:OP 要求一个正方形(等边矩形)。鉴于极坐标更没有意义。 哎呀,我的意思是上面的评论中的“正方形”(以及第二个实例的“圆形”)...... 【参考方案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();

【讨论】:

【参考方案2】:

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

那么你的问题到底是什么。我只能看到一种有意义的方式来解释这个问题:“在极坐标中正方形角的坐标是多少?” 但是我看不出你是如何将它与你的心智模型中的 OpenGL 联系起来的。

【讨论】:

【参考方案3】:

我找到了解决办法。

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();

【讨论】:

以上是关于在OpenGL中用极坐标绘制正方形的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 用纹理绘制正方形的最简单方法

openGL在不同显示模式下绘制圆形三角形和正方形

OpenGL 实现正方形绘制,键盘控制移动(三)

OpenGL绘制三角形而不是正方形

OpenGL:GL_QUADS 不绘制正方形

OpenGL - 004通过简单案例介绍绘制渲染流程