我想使用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;
}
答案 0 :(得分:2)
如评论中所述,一个技巧是规范化输入,这样如果你交换端点,它们将自动换回。
一种可能的方法是强制执行端点按字典顺序排序(最小的X首先出现,如果是平局,最小的Y)。
答案 1 :(得分:0)
DDA算法没有这样的问题,可以明确表示为
X = X0 + (k.DX) rnd D
Y = Y0 + (k.DY) rnd D
其中D = max(|DX|, |DY|)
,rnd
是一个舍入操作,k
从0
转到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
是一些舍入偏移量(通常为0
或D>>1
)。