带角度的快速二维近邻搜索。
flanders的Python项目详细描述
弗兰德斯:快速二维近邻搜索,角度
`.-:://////:-.` `-/oyhddddmmddddddNmdmdhs/` -ohddddddddddddNddddddNddddmmds. `hmmmmmdddddddddddNddddmmddddmmddm. `hddddddmmddddddhyyysoossyhdmNmdddNs sddddddddmmho/:-------------:odmmmmo :mddddddddd+-------------------:hddd. dddddddddm+---------------------:ms. :mddddddddd-----------------------s/` yddddddddds------------------------:s `mddddddddm+-----://////+/:---://////y` -Nddddddddm/----+:` `./+-+-` `.+: /mddddddddN:---o` -d- -. o- omddddddddN////y -d/ `m. y+ +: sdddhhNmmmN+/::o: `-` `+so++//:. `:+` `---. ydd+::mdddm:----/+-.````-:+:------:+s/- o/::/+- sN:-oomdddm+------://+///:---------:s `.-.` s-----+/` oN:---smddds------------:+oyhhysssydhs:. -o/://+-`.o:----/o` /mh:---hyyy/----------+hdmmmmdddddmmmddho. /+-----:+/-o:----:+` `.. .mddyyydo-----:///::ohdmmdmmdmddNdmmdmmddd/ :+/-----:+/y-----:+-` .:+///+. dddddddd----:mMMNNddddddmddmdddmmdmddmdddm: ``-/+:----::-------:/+++:----/+ +mdddddN----:MMMMMNmmmmmmmdddddddhhhhhys+/. .////+//+o:--------------/-----/o` sdddddm/----oNmdmNNNNMMMm//os--...`` y:-----:/+o------------------:o: :ydddm+-----:oyyyysydMMm:::o+. :o/:----------------+o:-----:s` .::+o--------://++oooo+:--:s -:/+/:--------------s/----s. -o------------------:/o+. `-/+o------------/---+d- `+o------------------::h .s/---------:::ohhhs y.-++:-----------------d:` dhys+///+oyhhhhyhm/ `s````:/++o+//:::://+++/-.s. /dddhhhhhhyyhhhddhym` -s`````````..-:::/h/s-````.s` :dyyhddddddddddhyyyym `ydy-`````````````s:.-o/````sy/-` yyyyyyyyyyyyyyyyyyyhs `./+ooymhyhy/.`````````:o....++``:dmdhhhso:` dyyyyyyyyyyyyyyyyyym:`-/oyddhyyyyhddyyhhs+-``````hso++ohd++dyyddyyyyhhyo/` myyyyyyyyyyyyyyyyyyNhhhyyyyyyyyyyyyddyyyyyhdyso++ddhmhmddhhyyyyddyyyyyyyhdy+.
使用pip
安装$ pip install flanders
示例
在本例中,我们有6个点(编号为0到5)和两个参考 具有一定的视图向量和视图角度的点。第一次引用 点找到点2。第二个参考点找不到任何 视角内的邻居并返回-1。
importflanderspoints=[(60.4,51.3),(173.9,143.8),(132.9,124.9),(19.5,108.9),(196.5,9.9),(143.3,53.3)]num_points=len(points)context=flanders.new_context(num_points=num_points,points=points)indices=flanders.search_neighbors(context=context,coordinates=[(119.2,59.7),(155.2,30.2)],view_vectors=[(0.0,1.0),(-1.0,-1.0)],angles_deg=[90.0,90.0])assertindices==[2,-1]flanders.free_context(context)
如果忽略视图矢量和角度,代码将搜索 不考虑任何角度的最近邻居:
indices=flanders.search_neighbors(context=context,coordinates=[(119.2,59.7),(155.2,30.2)])assertindices==[5,5]
不必搜索坐标的近邻,您还可以 按点的最近邻按其索引搜索:
indices=flanders.search_neighbors(context=context,ref_indices=list(range(num_points)),view_vectors=[(1.0,1.0)for_inrange(num_points)],angles_deg=[90.0for_inrange(num_points)])assertindices==[2,-1,1,2,-1,1]
对于调试,您可以使用简单而缓慢的实现:
indices=flanders.search_neighbors(context=context,coordinates=[(119.2,59.7),(155.2,30.2)],view_vectors=[(0.0,1.0),(-1.0,-1.0)],angles_deg=[90.0,90.0],naive=True)assertindices==[2,-1]
效率考虑因素
如果计算许多点的近邻,最好是 发送一整批点,而不是逐点计算。 如果发送整个批处理,代码将共享内存并行化 在点上的循环。