为了账号安全,请及时绑定邮箱和手机立即绑定

python中的三边测量

python中的三边测量

江户川乱折腾 2021-06-01 20:18:06
我正在研究定位系统。我的输入是一个字典,它会给我们从点(x1,y1)等半径为 d1 的圆。我想要的输出是一个数组(类似于二维坐标系),其中相交区域标记为 1,其余为 0。我试过这个:xsize=3000ysize=2000lis={(x1,y1):d1,(x2,y2):d2,(x3,y3):d3}array=np.zeros((xsize,ysize))for i in range(xsize-1):    for j in range(ysize-1):        for element in lis:            if distance((i,j),element)<=(lis[element]):                array[i][j]=1            else:                array[i][j]=0                breakdef distance(p1,p2):    return math.sqrt((p1[0]-p2[0])**2+(p1[1]-p2[1])**2)唯一的问题是数组很大并且花费的时间太长(循环数为 1000 万次),尤其是在树莓派上,否则会起作用。有没有办法使用openCV和图像来做,然后画圆圈来更快地获得相交区域?它必须是 python 2.x。
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

由于您已经在使用 numpy,请尝试以矢量化方式重写您的操作,而不是使用循环。


# choose appropriate dtype for better perf

dtype = np.float32


# take all indices in an array

indices = np.indices((ysize, xsize), dtype=dtype).T

points = np.array(list(lis.keys()), dtype=dtype)


# squared distance from all indices to all points

dist = (indices[..., np.newaxis] - points.T) ** 2

dist = dist.sum(axis=-2)


# squared circle radii

dist_thresh = np.array(list(lis.values()), dtype=dtype) ** 2


intersect = np.all(dist <= dist_thresh, axis=-1)

在我的机器上,这比 for 循环版本快 60 倍左右。


它仍然是一个蛮力版本,可能对所有坐标进行许多不必要的计算。问题中没有给出圆圈,因此很难对它们进行推理。如果它们覆盖的区域相对较小,那么如果考虑较小的区域,问题的解决速度会快得多(仍然是计算上的,而不是分析上的)。例如,代替测试所有坐标,可以使用圆的边界框的交点,这可以显着减少计算负载。


查看完整回答
反对 回复 2021-06-06
  • 2 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号