Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graphics 绘制四连通线的算法_Graphics_Line_Bresenham - Fatal编程技术网

Graphics 绘制四连通线的算法

Graphics 绘制四连通线的算法,graphics,line,bresenham,Graphics,Line,Bresenham,我正在寻找一个算法(用Java编码就好了,但是任何足够清晰的东西都可以翻译成Java)来画一条4连通线。这似乎是应用最广泛的,但我发现所有可以理解的实现都是8-connected。OpenCV的函数显然有一个4-connected版本,但对我来说,作为一个平庸且几乎不懂C语言的程序员,源代码是难以理解的。其他各种搜索均未发现任何结果 感谢任何人提供的帮助。下面是一个类似Bresenham的算法,它可以绘制4条连通线。代码是用Python编写的,但我认为即使您不懂Python语言,也很容易理解 d

我正在寻找一个算法(用Java编码就好了,但是任何足够清晰的东西都可以翻译成Java)来画一条4连通线。这似乎是应用最广泛的,但我发现所有可以理解的实现都是8-connected。OpenCV的函数显然有一个4-connected版本,但对我来说,作为一个平庸且几乎不懂C语言的程序员,源代码是难以理解的。其他各种搜索均未发现任何结果


感谢任何人提供的帮助。

下面是一个类似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版本,我就会发布它。