2010-05-11 75 views
4

我试图编程生成二维多边形的斜边。例如,给定的4个顶点界定的正方形阵列,我要生成这样的事:生成二维多边形的斜边

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

但计算的内部形状的顶点莫名其妙我。

简单地创建一个原始形状的副本并缩小它在一般情况下不起作用。 (想象一下,试图以这种方式斜切一个N形多边形。)

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

而且因为我没有太多的数学背景,所以我被卡住了。我如何找到中心角度?还是有更简单的方法来攻击这个问题?

+0

请问你总是有4个顶点或者你需要一个解决方案,对于任意数量的工作吗? – Skywalker 2010-05-11 20:37:20

+0

以什么方式简单地缩小它不起作用? – mathmike 2010-05-11 20:38:26

+0

@Skywalker我需要一个适用于任何凸或凹多边形的通用解决方案。 – Metaphile 2010-05-11 20:50:16

回答

1

一般算法非常复杂。您正在查找的操作称为偏移多边形;如果你搜索周围的,你可能会发现一些指点/论文等

如果你在或接近C++的工作,你可以尝试CGAL

+0

这似乎是我正在寻找的答案。但是,这比我所希望的更复杂。现在我将不得不放弃小说。 – Metaphile 2010-06-04 21:10:51

2

我会做这样的事情:

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

如果您尝试将其用于小于您的斜角尺寸宽度两倍的区域的形状上,则会发生可怕的破裂,否则应该是正常的。 (我相信你可以添加一些东西来处理这些情况,但这是另一个讨论)

或者,如果你想斜角宽度是相对于顶点,你也可以使用相同的原则推入那些'内部' 。通过平均它连接的边的法线来估计顶点的法线角。

0

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

v1 = p2 - p1 
v2 = p3 - p1 

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