Graphics 绘制四连通线的算法
我正在寻找一个算法(用Java编码就好了,但是任何足够清晰的东西都可以翻译成Java)来画一条4连通线。这似乎是应用最广泛的,但我发现所有可以理解的实现都是8-connected。OpenCV的函数显然有一个4-connected版本,但对我来说,作为一个平庸且几乎不懂C语言的程序员,源代码是难以理解的。其他各种搜索均未发现任何结果Graphics 绘制四连通线的算法,graphics,line,bresenham,Graphics,Line,Bresenham,我正在寻找一个算法(用Java编码就好了,但是任何足够清晰的东西都可以翻译成Java)来画一条4连通线。这似乎是应用最广泛的,但我发现所有可以理解的实现都是8-connected。OpenCV的函数显然有一个4-connected版本,但对我来说,作为一个平庸且几乎不懂C语言的程序员,源代码是难以理解的。其他各种搜索均未发现任何结果 感谢任何人提供的帮助。下面是一个类似Bresenham的算法,它可以绘制4条连通线。代码是用Python编写的,但我认为即使您不懂Python语言,也很容易理解 d
感谢任何人提供的帮助。下面是一个类似Bresenham的算法,它可以绘制4条连通线。代码是用Python编写的,但我认为即使您不懂Python语言,也很容易理解
def线路(x0、y0、x1、y1、颜色):
dx=abs(x1-x0)#行驶距离X
dy=绝对值(y1-y0)#行程距离Y
如果x0
其思想是,要画一条线,你应该以与理论线的DX/DY相匹配的比率增加X和Y。为此,我从一个初始化为0的错误变量e
开始(我们在线上),在每一步,我检查如果我只增加X或如果我只增加Y,错误是否更低(Bresenham检查是在只改变X或同时改变X和Y之间进行选择)
执行此检查的原始版本是添加1/dy
或1/dx
,但将所有增量乘以dx*dy
只允许使用整数值,这既提高了速度和准确性,也避免了dx==0
或dy==0
的特殊情况,从而简化了逻辑。
当然,因为我们在寻找比例误差,所以使用缩放增量不会影响结果
无论直线象限是什么,增量的两种可能性对误差总是有不同的符号效应。。。所以我的任意选择是增加X步的误差,减少Y步的误差
ix
和iy
变量是直线所需的实际方向(或+1或-1),具体取决于初始坐标低于或高于最终坐标
在一条4连通线中绘制的像素数显然是dx+dy
,因此我只做了那么多次循环来绘制线,而不是检查是否到达终点。注意,该算法绘制除最后一个像素外的所有像素;如果还需要最终像素,则应在循环结束后添加额外的draw\u pixel
调用
在下图中可以看到上述实现的示例结果
对于Python文盲,以下是6502代码的C版本:
void drawLine(int x0, int y0, int x1, int y1) {
int dx = abs(x1 - x0);
int dy = abs(y1 - y0);
int sgnX = x0 < x1 ? 1 : -1;
int sgnY = y0 < y1 ? 1 : -1;
int e = 0;
for (int i=0; i < dx+dy; i++) {
drawPixel(x0, y0);
int e1 = e + dy;
int e2 = e - dx;
if (abs(e1) < abs(e2)) {
x0 += sgnX;
e = e1;
} else {
y0 += sgnY;
e = e2;
}
}
}
void绘制线(int x0、int y0、int x1、int y1){
int dx=abs(x1-x0);
int-dy=abs(y1-y0);
int sgnX=x0
以下是的源代码。由于新的用户限制,我无法将其添加到原始帖子中。很抱歉接受时间太长,我被其他内容缠住了。一旦我编写了Java版本,我就会发布它。