gpt4 book ai didi

python - Numpy中的线段相交算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:28:57 51 4
gpt4 key购买 nike

我有两条线段 AB: (A1,B1), (A2,B2) 和 axis_dx 坐标区间。我应该找到轴坐标区间 即 axis_dx 交叉的所有点。我已经找到了那些点,但是,问题是有时代码会像下面的示例一样添加两个起点和终点坐标两次。我怎样才能解决所有情况下的问题,即对于线段线的任何位置......?提前感谢您的帮助。

简单示例: here

import numpy as np

def intrsctd_pnts(A,B, axis_dx):

N, M = np.shape(A)

# slope of each link ( straight line)
delta_x = (A[:, 0] - B[:, 0])
delta_y = (A[:, 1] - B[:, 1])
# Each line beginning and ending (min,max) values for intersected points
lx_min = np.minimum(B[:,0], A[:,0])
lx_max = np.maximum(B[:,0], A[:,0])
ly_min = np.minimum(B[:,1], A[:,1])
ly_max = np.maximum(B[:,1], A[:,1])

lx_floor = np.ceil(lx_min / axis_dx) * axis_dx
lx_ceil = np.floor(lx_max / axis_dx) * axis_dx
ly_floor = np.ceil(ly_min / axis_dx) * axis_dx
ly_ceil = np.floor(ly_max / axis_dx) * axis_dx

for i in range(N):
AB = []
if delta_x[i]<>0. and delta_y[i]<>0.:
m = delta_y[i]/delta_x[i]
b = B[i, 1] - m * B[i, 0]
# calculate all intersected x coordinates
x = np.arange(lx_floor[i], lx_ceil[i]+axis_dx, axis_dx)
y = m * x + b
AB = zip(x, y)
# calculate all intersected y coordinates
y = np.arange(ly_floor[i], ly_ceil[i]+axis_dx, axis_dx)
#print 'y: ',y
x = (y - b) / m
AB.extend(zip(x, y))
elif delta_x[i]==0. and delta_y[i]<>0.:
y = np.arange(ly_floor[i], ly_ceil[i]+axis_dx, axis_dx)
x = B[i,0]*np.ones(len(y))
AB = zip(x,y)
elif delta_x[i]<>0. and delta_y[i]==0.:
x = np.arange(lx_floor[i], lx_ceil[i]+axis_dx, axis_dx)
y = B[i,1]*np.ones(len(x))
AB = zip(x,y)

AB.append((B[i,0], B[i,1]))
AB.append((A[i,0], A[i,1]))
AB.sort()
return AB

# A = (A1,A2)
A = np.array([ [9., 23.], [21., 29.]]) # ,
# B = (B1,B2)
B = np.array([ [24., 35.], [28., 21.]]) # ,
axis_dx = 1.
intrsctd_pnts(A,B, axis_dx)

最佳答案

这是删除几乎重叠点的代码,如果两个连续点之间的距离小于阈值,则删除最后一个点:

r = np.array(intrsctd_pnts(A,B, axis_dx))
idx = np.where(np.sum(np.diff(r, axis=0)**2, -1) < 1e-20)[0]+1
r2 = np.delete(r, idx, axis=0)

关于python - Numpy中的线段相交算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20444148/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com