在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中用极坐标绘制正方形的主要内容,如果未能解决你的问题,请参考以下文章