OpenGL中点画线算法绘制负斜率直线的实现异常求助
中点画线算法负斜率场景代码修复方案
现存代码错误点
- 初始值逻辑错误:当前将判定值
d和起始y坐标y的初始化放在了dy>=0的else分支中,当dy为负时,这两个变量没有得到正确的初始赋值,直接导致绘制逻辑失效。 - 测试用例适配问题:你提供的测试坐标中dy绝对值为200,dx绝对值为150,斜率绝对值大于1,默认按x递增迭代的逻辑本身会出现精度缺失问题,需要额外适配。
修复后基础版代码(适配|斜率| ≤ 1的正负斜率场景)
x1=200 y1=400 x2=350 y2=200 dx = x2 - x1 dy = y2 - y1 # 初始化y步进方向和y初始值 y_step = 1 y = y1 # 处理dy符号,统一转为正值计算判定值 if dy < 0: y_step = -1 dy = -dy # 统一初始化判定值d,无论dy正负都要执行 d = 2 * dy - dx for x in range(x1, x2): glVertex2d(x, y) if d > 0: y += y_step d += 2 * (dy - dx) else: d += 2 * dy
全斜率适配说明
如果需要覆盖斜率绝对值大于1的场景,需要增加对dx、dy绝对值大小的判断:当|dy|>|dx|时,交换x和y的计算逻辑,按y递增/递减的方向迭代,同步修改判定值的计算方式即可。
内容的提问来源于stack exchange,提问作者Nur
相关产品推荐
相关产品推荐

