找到没有排序的line-meshgrid交叉点?

时间:2015-03-25 13:45:29

标签: c++ algorithm sorting graphics geometry

我试图找到没有排序的line-meshgrid交叉点。这是图:

enter image description here

已知:

  • 边界上的两个交点:(x0 y0)和(xN,yN) 众所周知。
  • 每个网格线的位置是已知的。 [-R R]是meshgrid的跨度。
  • 网格对齐以笛卡尔原点为中心。

我想要的是什么:

我希望根据从每个点到起点(x0,y0)或终点(xN,yN)的距离,以升序或降序获得所有交点的数组

例如:

(x0 y0), (x1,y1),(x2,y2)..., (xN,yN):可接受的

(xN yN), (xN-1,yN-1),(xN-2,yN-2)..., (x0,y0):可以接受。

(x0 y0), (x3,y3),(x1,y1)..., (xN,yN):不接受。

我遇到的问题:

我知道我至少可以用for循环来计算每个交点,但是我不知道如何在没有排序的情况下保存上面所示顺序的交叉点(前面的泡泡)。说,我从(x0,y0)开始,然后去找我的第一个十字路口?特别是,我应该沿着x方向前进,还是应该沿着y方向前进,以便能够击中我的第一个交叉路口?那下一步到我的第二个怎么样?

我认为无论如何都要在"自然"几何方式?线的斜率(假设线不是垂直的)是已知的,并且网格是已知的,所以我们可以在这里玩什么技巧?非常感谢

此外:

如果我想并行完成所有交叉点怎么办?说,在CUDA。

1 个答案:

答案 0 :(得分:1)

假设单位图块大小,交叉点的坐标分别位于x = iy = j,以增加索引。

使用参数线方程x = X + t U, y = Y + t V,交叉点出现在t = (i - X) / Ut = (j - Y) / V,为方便起见,我们重写U V t = V (i - X)U V t = U (j - Y)

这两个序列是自然排序的,它们遵循常见差异VU以及初始索引i = Ceil(X)j = Ceil(Y)的两个算术级数。那么你需要做的是合并两个序列。

# Initialize
i= Ceil(X), j= Ceil(Y)
Tx= V (i - X), Ty= U (j - Y)

# Loop until the final point
while i < XX and j < YY:
    # Move to the next intersection
    if Tx + V < Ty + U:
      Increment i, Tx+= V
    elif Tx + V > Ty + U:
      Increment j, Ty+= U
    else:
      Increment both i and j, Tx+= V, Ty+= U

交叉点的第二个坐标是从T的相关值中找到的。