平面的共面方程

时间:2016-03-28 19:06:04

标签: python plane

我的问题类似于这篇文章,尽管该海报涉及相邻的面孔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

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

1 个答案:

答案 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)