You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 20:15:45