我的问题类似于这篇文章,尽管该海报涉及相邻的面孔How to merge adjacent coplanar faces on a mesh
我能够从stl中提取每个三角形面的平面方程,然后将它们转换为numpy数组
ax + by +cz = d
plane_eq=np.array([a,b,c,d])
我如何比较平面方程并确定哪些是共面的并最终将它们合并为一个大平面方程?
sympy图书馆有一个课程,但我无法让它与Anaconda合作。 http://docs.sympy.org/latest/_modules/sympy/geometry/plane.html#Plane.is_coplanar
另外,我尝试了一种方法,我采用法线并通过点积将它们相互比较
答案 0 :(得分:1)
表示平面的两个[a, b, c, d]
向量是共面的,如果它们只是彼此的标量因子倍数。
您可以将每个矢量标准化并进行比较。
def are_coplanar(plane1, plane2):
# planes are given as [a, b, c, d], ax+by+cz=d
return numpy.all(plane1 / length(plane1) - plane2 / length(plane2) == 0)
其中length
是矢量幅度,numpy.linarlg.norm
或滚动您自己的length = lambda a: numpy.dot(a, a)**0.5
。
要处理飞机退化([0, 0, 0, 0]
)的情况,请使用等效但安全:
return numpy.all(plane1 * length(plane2) - plane2 * length(plane1) == 0)
但总的来说,你可能最有意义的是将所有平面方程标准化(除以长度但检查退化),以便检查它们是一个简单的相等。
您还可以检查plane1 / plane2
中的所有比率是否相等,但需要在plane2
中正确处理零:
def are_coplanar(plane1, plane2):
first = numpy.where(plane2)[0][0] # TODO: handle all zeros
return numpy.all(plane2 * plane1[first]/plane2[first] - plane1 == 0)