我试图找到没有排序的line-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。
答案 0 :(得分:1)
假设单位图块大小,交叉点的坐标分别位于x = i
和y = j
,以增加索引。
使用参数线方程x = X + t U, y = Y + t V
,交叉点出现在t = (i - X) / U
和t = (j - Y) / V
,为方便起见,我们重写U V t = V (i - X)
,U V t = U (j - Y)
。
这两个序列是自然排序的,它们遵循常见差异V
和U
以及初始索引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
的相关值中找到的。