Для такого рода вещей вы, возможно, захотите создать простой класс с пользовательским хеш-методом, чтобы вы могли определить идентичные значения.Таким образом, вам не нужно вдаваться в грязный бизнес, сравнивая все ценности друг с другом.Как только вы можете хешировать уникальную комбинацию из двух точек и значения, вы просто создаете два набора своих списков и пересекаете их.
Базовый пример будет выглядеть примерно так (с openMaya MVectors вместо точек pymel -но идея та же самая)
from maya.api.OpenMaya import MVector
class PointHash(object):
def __init__(self, p1, p2, v):
self.p1 = p1
self.p2 = p2
self.value = v
self._hashvalue = hash((p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, v))
def __hash__(self):
return self._hashvalue
def __eq__(self, other):
return hash(self) == hash(other)
def __repr__(self):
return "PointHash %i" % self.__hash__()
#sample data
a = MVector(1.1, 2.2, 3.3)
b = MVector(1.0009, 2.00019, 3.0001)
c = MVector(21.0, 22.0, 23.0)
# some lists
set_one = set((PointHash(a, b, 1.0), PointHash(b, a, 1.0), PointHash(a, b, 2.0), PointHash(b, c, 1.0)))
set_two = set((PointHash(a, b, 1.0), PointHash(b, a, 1.1), PointHash(a, b, -1.0), PointHash(b, c, 1.0)))
print "common:"
for item in set_one.intersection(set_two):
print item.p1, item.p2, item.value
#> (1.1, 2.2, 3.3) (1.0009, 2.00019, 3.0001) 1.0
#> (1.0009, 2.00019, 3.0001) (21, 22, 23) 1.0
Как написано, это потребует совпадения EXACT для получения тех же значений, вы можете обнаружить, что хотите квантовать фактические значения вершин или что угодно, чтобынемного более грубое разрешение, чтобы ловить промахи тоже.Как написано, он также предполагает, что PointHash(a,b, 1.0)
- это не то же самое, что PointHash(b,a,1.0)
, что может или не может быть желаемым поведением.
Фактическое хеширование выполняется методом __init__
, и он крадет встроенное хеширование кортежей Python, что приятно и быстро.
Связано: http://discourse.techart.online/t/geometry-hash/3144