从Bresenham算法中获得独特的结果

时间:2018-03-02 01:09:09

标签: c# math computational-geometry

我想使用Bresenham's algorihm栅格化一行。我的插值顶点不应包含对角线步长。我在StackOverflow上进行了一些搜索,而this topic似乎就是我需要的东西。

我遇到的唯一问题是,如果我更改输入顺序,我需要获得相同的结果,我的意思是,如果我交换 startPoint endPoint 我需要获得相同的插值顶点集。

//the Method definition
List<Point> plotPoints(Point startPoint, Point endPoint);

//The thing I'm looking for
plotPoints(startPoint, endPoint)==plotPoints(endPoint, startPoint)

代码与The answer几乎相同。但是我为我的目的做了一些定制:

        private float step=0.5;
        public static List<Vector3> plotPoints(float x0, float y0, float x1, float y1) {
            List<Vector3> plottedPoints = new List<Vector3>();
            float dx = Mathf.Abs(x1 - x0), sx = x0 < x1 ? step : -step;
            float dy = -Mathf.Abs(y1 - y0), sy = y0 < y1 ? step: -step;
            float err = dx + dy, e2; /* error value e_xy */

            for (; ; ) {  /* loop */
                if (x0 == x1 && y0 == y1) break;
                plottedPoints.Add(new Vector3(x0,0, y0));
                e2 = 2 * err;
                if (e2 >= dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */
                else if (e2 <= dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */
            }

            return plottedPoints;
        }

2 个答案:

答案 0 :(得分:2)

如评论中所述,一个技巧是规范化输入,这样如果你交换端点,它们将自动换回。

一种可能的方法是强制执行端点按字典顺序排序(最小的X首先出现,如果是平局,最小的Y)。

答案 1 :(得分:0)

DDA算法没有这样的问题,可以明确表示为

X = X0 + (k.DX) rnd D
Y = Y0 + (k.DY) rnd D

其中D = max(|DX|, |DY|)rnd是一个舍入操作,k0转到D

如果交换端点,则增量更改符号并进行交易

Y0 + (k.DY) rnd D

Y1 + ((D-k).(-DY)) rnd D = Y1 - DY + (k.DY) rnd D = Y0 + (k.DY) rnd D

这意味着该算法自然是可逆的&#34;。

要实现这一点,rnd操作必须享受翻译不变性属性rnd(x+n) = rnd(x)+n,该属性对应于(k.DY) rnd D = floor((k.DY + S) / D) S是一些舍入偏移量(通常为0D>>1)。