想用python写一个程序,需要进行如下图的数据筛选,在一条轴上有
A1,A2,B1,B2的点及点坐标的数据,A1A2为一个线段,B1B2为一个线段,线段A与线段B随机分布在坐标轴上
需要判断所有最接近的线段A与线段B之间的间距是否存在大于10的,如果存在则保存满足该间距的线段的A1,A2,B1,B2坐标
举一个例子:
A1 = [10,40,100]
A2 = [20,50,200]
B1 = [21,70]
B2 = [35,85]
根据规则线段A 10-20 40-50 100-200
线段B 21-35 70-85
线段A 10-20 与线段B 21-35 距离最近,距离为1
线段A 100-200 与线段B 70-85 距离最近,距离为15
符合条件的坐标为A1 100 A2 200 B1 70 B2 85,保存四个点坐标
请问这样的程序如何编写?或者有什么好用的模块处理?
我的初步思路是写一个字典把每一个点的数据存进去,再通过循环一遍筛,但是无法确定坐标的数量,循环起来很繁琐,请问有没有更简便的方法?谢谢!
符合要求的线段只可能是B2-A1或A2-B1
找到最左侧的A2或B2(即第一个线段的右端点),
对于A2,扫描其右侧的第一个A1(即其右侧第一个B线段的左端点),如果符合条件则记录,如果不符合条件,则接下来扫描得到的A1对应的B2
对于B2同理
可以维护两个变量记录已经扫到了A,B组内的第几个线段,降低查找时的循环次数
有帮助请采纳
A1 = [10, 40, 100]
A2 = [20, 50, 200]
B1 = [21, 70]
B2 = [35, 85]
a = b = 0
result = []
distance = 10
left_distance = distance + 1 # 判断左侧,最左侧无距离
left, pos = (A2[a]), 0 if A2[a] < B2[b] else (B2[b], 1) # 最开始的右端线段
while True:
try:
if not pos: # A,线段
while True:
if B1[b] > A2[a]: # 如果找到右侧的线段
line_distance = B1[b] - A2[a]
if min(line_distance, left_distance) > distance: # 找到符合要求的
result.append([[A1[a], A2[a], B1[b], B2[b]]]) # 添加
pos = 1 # 切换到B
left_distance = line_distance
break
else:
b += 1
else: # A,线段
while True:
if A1[a] > B2[b]: # 如果找到右侧的线段
line_distance = A1[a] - B2[b]
if line_distance > distance: # 找到符合要求的
result.append([[A1[a], A2[a], B1[b], B2[b]]]) # 添加
pos = 0 # 切换到A
break
else:
a += 1
except:
print(result)
break