Python中基于Midpoint Circle Drawing Algorithm的OpenGL画圆失败求助
中点圆绘制算法在OpenGL中无法显示圆形的问题解决
问题排查与修复步骤
1. 视口参数错误导致绘制内容不可见
glViewport的参数是窗口内视口的左下角坐标+宽高,原代码里的glViewport(-250, -150, 250, 150)把视口放在了窗口外面,画的点根本不在可见区域里。
修复:改成和窗口尺寸匹配的视口:
glViewport(0, 0, 700, 700)
2. 投影范围与窗口比例不匹配,导致变形或显示不全
原gluOrtho2D设置的是(-250.0, 250.0, -150.0, 150.0),宽高比是5:3,但窗口是700x700(1:1),不仅圆形会被拉伸,还可能因为视口错误导致部分点显示不出来。
修复:调整投影范围为1:1,适配窗口:
gluOrtho2D(-350.0, 350.0, -350.0, 350.0)
3. 缺失窗口清除颜色设置(非致命但建议添加)
原代码没设置窗口背景色,加上后能更清楚看到绘制的圆形:
在main_function里添加:
glClearColor(0.0, 0.0, 0.0, 1.0)
4. 确认中点圆算法逻辑正确
你的中点圆算法逻辑是对的,循环条件while (y <= x)、决策变量d的计算都没问题,不需要修改。
修复后的完整代码
from OpenGL.GL import * from OpenGL.GLU import * from OpenGL.GLUT import * class MidPoint(object): def iterate(self): # 修复视口,匹配窗口尺寸 glViewport(0, 0, 700, 700) glMatrixMode(GL_PROJECTION) glLoadIdentity() # 调整投影范围为1:1,适配700x700窗口 gluOrtho2D(-350.0, 350.0, -350.0, 350.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() def showScreen(self): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() self.iterate() glColor3f(0.5, 1.0, 1.0) self.drawCircle(100) glutSwapBuffers() def drawCircle(self,r): x = r y = 0 d = 1 - r self.draw8Way(x, y) while y <= x: if d < 0: d += 2 * y + 3 y += 1 else: d += 2 * y - 2 * x + 5 x -= 1 y += 1 self.draw8Way(x, y) def draw8Way(self,x,y): glPointSize(5) glBegin(GL_POINTS) glVertex2f(x, y) glVertex2f(y, x) glVertex2f(-x, y) glVertex2f(-y, x) glVertex2f(-x, -y) glVertex2f(-y, -x) glVertex2f(x, -y) glVertex2f(y, -x) glEnd() def main_function(self): glutInit() glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE) glutInitWindowSize(700, 700) glutInitWindowPosition(100,100) glutCreateWindow(b"OpenGL Coding Practice") # 设置窗口背景色 glClearColor(0.0, 0.0, 0.0, 1.0) glutDisplayFunc(self.showScreen) glutMainLoop() MidPoint().main_function()
内容的提问来源于stack exchange,提问作者treeoid
相关产品推荐
相关产品推荐

