我想分别绘制所有1/4的圆,但是我的窗口设置,原点位于左上角(0,0)。无论如何,我可以绕过不再次反转屏幕?
我目前的实施是:
//nX: x
//nY: y
//nR: radius
//verts: std::vector<int>
//indices: std::vector<uint32_t>
verts.push_back(nX + nR); verts.push_back(nY + nR);
for (int i = 270; i >= 360; i -= slice_count)
{
verts.push_back(nX + cos(DEG_TO_RAD * i) * nR);
verts.push_back(nY + sin(DEG_TO_RAD * i) * nR);
}
//...
//rest of the code are index manipulation
glDrawElements(GL_TRIANGLE_STRIP, indices.size(), GL_UNSIGNED_INT, &indices[0]);
这个只会画
| -
| -
| -
| -
| -
| -
| -
| -
| -
| -
|____________________
如果我开始从270到360的旋转只是为了进行上面的绘图,它会让我感到困惑。你可以建议任何方式来缓解我的困惑吗?它在逻辑上也不对,对吧?
这是我制作的新测试代码。
glBegin(GL_TRIANGLE_FAN);
glVertex2i(500, 400);
for (int i = 360; i >= 270; --i)
{
int ax = (500 + cos(DEG_TO_RAD * i) * 100);
int ay = (400 + sin(DEG_TO_RAD * i) * 100);
glVertex2i(ax, -ay);
}
glEnd();
答案 0 :(得分:1)
嗯,(0,0)位于屏幕左上方这一事实使得X向右(这与通常的数学表示形式一致),但是正Y向下(这不是与通常的数学表示一致)。如果你想模仿通常的函数绘制数学的行为,在0º-90º球体象限位于右上方,你可以只反转Y坐标。
换句话说,试试:
verts.push_back(nY - (sin(DEG_TO_RAD * i) * nR));