【问题标题】:Algorithm for offsetting edges of 3D triangle mesh用于偏移 3D 三角形网格边缘的算法
【发布时间】:2015-11-30 21:12:28
【问题描述】:

我有一个 3D 三角形网格,我正在寻找一种算法来沿三角形网格的表面向内偏移网格的所有 无边界边缘 边界边缘。

我查看了Clipper 中提到的An algorithm for inflating/deflating (offsetting, buffering) polygons,但它并不能真正处理 3D,也不能保留三角形网格,而且我不确定重新三角化生成的边界以匹配原始输入网格更容易解决。

关于我如何实现这一点的任何建议?

【问题讨论】:

  • 问题似乎有些不明确;虽然图片给出了一些粗略的概念,但究竟什么是无边框边缘?
  • 我认为“无边界边缘”必须是指边界上的边缘,如您的图所示?即,仅由一个而不是两个三角形共享的边?我会以特别的方式处理它,计算新的偏移边缘坐标。我不认为你会找到这个特定任务的代码。
  • 抱歉,约瑟夫是对的。这变得更复杂的是,在某些情况下需要创建新的三角形(在图片中发生),而在其他情况下,需要删除三角形。有时,即使是不在边缘的三角形也会受到影响,例如,如果它们的边界是位于边缘但小于偏移距离的三角形。
  • hmm 我会 1. 将您的网格转换为一组平面(只是边界折线 your bold black lines 不是完整的三角剖分) 2. 然后根据您的缩小/修剪/移动/剪切正确的折线任务which is not described well enough 3. 然后三角化回到网格。这样,您就可以在您链接的算法应该工作的二维空间中工作。如果您的网格有曲面/侧面,这将不起作用(除非您将面选择方法从平面更改为边界)
  • @Spektre 对于任何具有共面三角形的网格,可能会有一个类似的网格,其中没有一个三角形是共面的,此时我又回到了我开始的地方。组合共面三角形可能有助于解决特定情况,但我认为这并不能让我更接近适用于所有情况的解决方案。

标签: algorithm geometry


【解决方案1】:

基于边界边仅由一个三角形共享的假设:

你需要

  • 地图边缘 -> 三角形:e2t
  • 多地图点 -> 三角形:p2t
  • 一组跟踪已修改点:pts

这样就可以了

for all triangles do:
    for each edge do:
        normalize edge: e.p1 < e.p2
        if the egde is in e2t: put edge/dummy into e2t
        else: put the edge/triangle into e2t

    for each point do:
        put point/triangle into p2t

prune all edge/dummy from e2t

while e2t is not empty:
    remove first edge/triangle from e2t -> e,t
    calculate replacement points for t: e.p1,e.p2 -> q1,q2
        unless the point is in pts
    use p2t to update all triangles with e.p1->q1 and all with e.p2->q2:
        update e2t if the modified edge is in there
    add each modified point to pts

要计算替换点,您必须找到不在同一平面上的共享三角形 -> 这定义了移动点的方向。

它看起来像这样:

【讨论】:

    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多