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