簡體   English   中英

檢查點之間最近距離的最快方法

[英]The fastest way of checking the closest distance between points

我有2本字典。 兩者都具有索引和世界空間位置的鍵值對。

就像是:

{
  "vertices" : 
  {
    1: "(0.004700, 130.417480, -13.546420)",
    2: "(0.1, 152.4, 13.521)",
    3: "(58.21, 998.412, -78.0051)"
  }
}

詞典1將始終具有大約20至100個條目,詞典2將始終具有大約10,000個條目。

對於字典1中的每個點,我想找到字典2中最接近它的點。 最快的方法是什么? 對於字典1中的每個條目,循環瀏覽字典2中的所有條目 ,然后返回最接近的條目

一些未經測試的偽代碼:

for point, distance in dict_1.iteritems():
    closest_point = get_closest_point(dict_1.get(point))


def get_closest_point(self, start_point)

    furthest_distance = 2000000
    closest_point = 0

    for index, end_point in dict_1.iteritems():
        distance = get_distance(self, start_point, end_point)
        if distance < furthest_distance:
            furthest_distance = distance
            closest_point = closest_point

    return closest_point

我認為這樣會起作用。 “問題”是,如果我在字典1中有100個條目,它將是100 x 10,000 = 1,000,000次迭代。 在我看來,這似乎並不很快或優雅。

在Maya / Python中是否有更好的方法?

編輯:只是想評論一下,我以前使用過closestPointOnMesh節點,它工作得很好,並且如果您要檢查的點實際上是網格的一部分,則容易得多。 您可以執行以下操作:

selected_object = pm.PyNode(pm.selected()[0])
cpom = pm.createNode("closestPointOnMesh", name="cpom")

for vertex, distance in dict_1.iteritems():
    selected_object.worldMesh >> cpom.inMesh

    cpom.inPosition.set(dict_1.get(vertex))
    print "closest vertex is %s " % cpom.closestVertexIndex.get()

來自該節點的即時答復,一切都很輕松。 但是,如果要檢查的點列表不是網格的一部分,則不能使用它。 實際上是否可能/願意:

  • 根據字典2中的點構造網格
  • 與最近的PointOnMesh節點一起使用網格
  • 刪除網格

您肯定需要非平凡數量點的加速結構。 您想要的是KD樹或八叉樹-KD樹在搜索中性能更高,但構建速度較慢,並且可能更難編碼。 同樣,由於八進制是空間的而不是二進制的,因此它們可能會使進行瑣碎的測試變得更加容易。

您可以在此處獲取python八叉樹: http//code.activestate.com/recipes/498121-python-octree-implementation/

如果您要進行大量距離檢查,則肯定要使用Maya API向量類進行實際的數學比較-盡管這將比同等的python快很多,但要快得多。 如果您不太了解API,則可以從pymel.datatypes獲取這些信息,盡管使用更新的API2版本非常容易。

您需要所謂的KD樹。 用第二個字典中的點構建KD樹,並查詢最接近第一個字典中每個點的點。

我不熟悉maya,如果可以使用scipy,則可以使用this

PS:似乎是在C ++中實現

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM