Bresenham直线绘制代码异常:出现多余连线,求修复方案
问题解决方法
你的问题出在循环逻辑上:当前代码会遍历点列表里所有相邻的点对,所以[200, 300]和[500, 620]这对本不该相连的点也被用Bresenham算法连起来了。要画两条断开的直线,只需要让代码只处理你需要的两组点对就行,下面给两种简单的修改方式:
方法一:重新组织点列表结构
把要绘制的两条直线的点对单独分组,这样循环只会处理每组内的点对:
import numpy as np import cv2 # 把两条直线的点分别放在子列表里 pnts = [ [[100, 150], [200, 300]], [[500, 620], [700, 500]] ] canvas = np.ones((800,800), np.uint8) def setPixel(x, y): canvas[y, x] = 255 # 遍历每组直线的点对 for line in pnts: x0, y0 = line[0] x1, y1 = line[1] dx = abs(x1 - x0) dy = abs(y1 - y0) sx = 1 if x0 < x1 else -1 sy = 1 if y0 < y1 else -1 err = dx - dy while True: setPixel(x0, y0) if x0 == x1 and y0 == y1: break e2 = 2 * err if e2 > -dy: err = err - dy x0 = x0 + sx if e2 < dx: err = err + dx y0 = y0 + sy cv2.imwrite('plot lines1.jpg', canvas) cv2.imshow('image', canvas) cv2.waitKey(0) cv2.destroyAllWindows()
方法二:在原循环中跳过不需要的点对
如果不想改动点列表的结构,直接在循环里跳过索引为1的那组点对(也就是[200,300]和[500,620]的组合):
import numpy as np import cv2 pnts = [[100, 150], [200, 300], # 这两个点不该连线 [500, 620], [700, 500]] canvas = np.ones((800,800), np.uint8) def setPixel(x, y): canvas[y, x] = 255 for i in range(0, len(pnts) - 1): # 跳过i=1的情况,即跳过[200,300]到[500,620]的连线 if i == 1: continue x0 = pnts[i][0] y0 = pnts[i][1] x1 = pnts[i+1][0] y1 = pnts[i+1][1] dx = abs(x1 - x0) dy = abs(y1 - y0) sx = 1 if x0 < x1 else -1 sy = 1 if y0 < y1 else -1 err = dx - dy while True: setPixel(x0, y0) if x0 == x1 and y0 == y1: break e2 = 2 * err if e2 > -dy: err = err - dy x0 = x0 + sx if e2 < dx: err = err + dx y0 = y0 + sy cv2.imwrite('plot lines1.jpg', canvas) cv2.imshow('image', canvas) cv2.waitKey(0) cv2.destroyAllWindows()
两种方法都能实现只画两条断开的直线,第一种更灵活,后续添加更多直线也方便;第二种改动最小,适合快速调整现有代码。
内容的提问来源于stack exchange,提问作者user01294587633
相关产品推荐
相关产品推荐

