平面的共面方程

coplanar equations of a plane

我的问题与此类似 post 尽管 poster 与相邻面有关 How to merge adjacent coplanar faces on a mesh

我能够从 stl 中提取每个三角形面的平面方程,然后将它们转换为 numpy 数组

ax + by +cz = d
plane_eq=np.array([a,b,c,d])

如何比较平面方程并确定哪些是共面的并最终将它们合并为一个大平面方程?

sympy 库为此提供了 class,但我无法让它与 Anaconda 一起正常工作。 http://docs.sympy.org/latest/_modules/sympy/geometry/plane.html#Plane.is_coplanar

此外,我确实尝试了一种方法,我采用法线并通过点积将它们相互比较

表示平面的两个 [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)