【问题标题】:coplanar equations of a plane平面的共面方程
【发布时间】:2016-03-29 04:21:22
【问题描述】:

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

另外,我确实尝试了一种方法,即获取法线并通过点积将它们相互比较

【问题讨论】:

    标签: python plane


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-23
      相关资源
      最近更新 更多