【问题标题】:Generating a beveled edge for a 2D polygon为二维多边形生成斜边
【发布时间】:2010-05-11 20:33:40
【问题描述】:

我正在尝试以编程方式为 2D 多边形生成斜边。例如,给定一个由 4 个顶点组成的数组定义一个正方形,我想生成如下内容:

 _________
|\ _____ /|
| |     | |
| |     | |
| |_____| |
|/_______\|

但是计算内部形状的顶点让我很困惑。

在一般情况下,简单地创建原始形状的副本并将其缩小是行不通的。 (想象一下尝试以这种方式对 N 形多边形进行斜切。)

到目前为止,我的算法涉及分析相邻边(顶点的三元组;例如,正方形的左下角、左上角和右上角顶点)。从那里,我需要找到它们之间的角度,然后在该角度的某处创建一个顶点,具体取决于我希望斜面的深度。

而且因为我没有太多的数学背景,这就是我被困的地方。我如何找到那个中心角?还是有更简单的方法来解决这个问题?

【问题讨论】:

  • 您是否总是有 4 个顶点,或者您需要一个适用于任意数量的解决方案?
  • 在什么情况下简单地缩小它不起作用?
  • @Skywalker 我需要一个适用于任何凸面或凹面多边形的通用解决方案。
  • @mathmike 考虑一个 C 形多边形。缩小版不能很好地融入原版。当然斜面不会是均匀的。

标签: graphics geometry


【解决方案1】:

我会这样做:

对于每一面,制作一个副本并将其“向内”推到所需的斜面宽度。 (“向内”沿着侧面的法线向量)。完成此操作后,找到新副本(以及它们之前相交的任何边的副本)之间的交点,并将它们用作内部形状的顶点。对于交叉点,您需要考虑真实的线(而不是线段),因为凹形区域中的边需要增长。

如果您尝试在区域小于斜角宽度两倍的形状上使用它,这将严重破坏,但否则应该没问题。 (我相信你可以添加一些东西来处理这些情况,但这是另一个讨论)

或者,如果您希望斜角宽度相对于顶点,您也可以使用相同的原理将那些“向内”推。通过平均连接边的法线来估计顶点的法线角度。

【讨论】:

    【解决方案2】:

    一般算法相当复杂。您正在寻找的操作称为偏移多边形;如果您四处搜索,您可能会找到一些指针/论文等。

    如果您正在使用或接近 C++,您可以尝试CGAL

    【讨论】:

    • 这似乎是我一直在寻找的答案。但是,它比我希望的要复杂。我现在将不得不放弃斜面。
    【解决方案3】:

    假设您的点是 p1,创建相邻边的点是点 p2 和 p3。然后取一个从 p1 到 p2 和 p1 到 p3 的向量。喜欢 -

    v1 = p2 - p1
    v2 = p3 - p1
    

    找到 v1 和 v2 之间的角度并生成您的点。您可以使用this 找到角度。

    【讨论】:

      猜你喜欢
      • 2022-12-10
      • 1970-01-01
      • 2013-01-13
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      相关资源
      最近更新 更多