如何将凸多边形分解为在X轴和Y轴上对齐的直角三角形?

时间:2009-02-11 15:36:37

标签: math graphics geometry polygons

给定由一组顶点表示的凸多边形(我们可以假设它们是逆时针顺序),如何将这个多边形分解成一组右三角形,其腿与X和Y对齐-axes?

由于我可能缺少一些数学术语,所以我称之为“腿”的是那两条斜边的线(如果我在表面刺伤数学术语,请提前道歉 - - 修正是额外的信用)。

6 个答案:

答案 0 :(得分:1)

我不确定是否要编写一个算法来执行此操作,但似乎完全有可能对一张纸上的任何凸多边形执行此操作。对于每个顶点,从该顶点垂直或水平地投射一条直到它遇到另一条垂直或水平线。对于角度变化较小的顶点,其中相邻边在x和y方向上都在相同方向上移动,您需要从顶点添加两条线,一条水平线和一条垂直线。 完成此操作后,您应该在原始多边形的中心留下一个多边形,但边的垂直或水平,因为边是由原始多边形的顶点绘制的线形成的。因为这些边是垂直的或水平的,所以这种形状可以很容易地细分为多个三角形,其中一个水平边,一个垂直边和一个斜边。

答案 1 :(得分:1)

我假设您已经按照上面描述的那样对顶点进行了排序,并确实定义了一个凸多边形。

每个顶点定义一条水平线。对于V顶点,那么,您将拥有一组V线。丢弃符合以下条件之一的任何行:

  • 定义该行的顶点或顶点具有最高或最低Y分量(如果一个顶点,该线仅在该点与多边形相交;如果是两个,该线与多边形边缘重合)
  • 如果两个顶点具有相等的Y坐标,则只保留其中一条线(它是重复的)。

结果将类似于多边形的“条带”。

每条水平线在两个点处与多边形相交。一个是它的定义顶点。另一个是另一个顶点,或由两个顶点定义的段上的点。你可以很容易地确定哪种情况 - 只需简单比较Y坐标。与段相交的坐标也很容易数学,我留给你。

每个交叉点定义一个垂直段。该段包含在多边形内(如果它与边缘重合,您可以将其丢弃),另一端与另一条水平线相交,或者如果该边缘本身是水平的则与多边形的边缘相交。确定案例再次仅仅是对坐标的比较。最后,如果只有一个,则可能有0-2个额外的垂直段,由具有最高和/或最低Y坐标的顶点定义。

现在生成的图表显示了每个带,如果可能的话,每个带都会修剪掉一个直角三角形。每个三角形都应符合您的标准。剩下的区域是矩形;绘制一个任意对角线,将每个对角线分成两个符合您标准的直角三角形。

你已经完成了。

答案 2 :(得分:0)

我不确定这是否可行。想想一个已经与X和Y轴上的边对齐的正方形。如何使用也与X,Y轴对齐的顶点绘制三角形?

或者允许多边形的实际边沿x,y轴。这意味着你可以在广场的对角线上划一条线。如果是这样,可能很难处理更复杂的多边形,其中一些边与轴对齐,而其他边则不是。

答案 3 :(得分:0)

我不相信这个问题有一个普遍的解决方案。问题是与X轴和Y轴位对齐。这意味着每个顶点都需要在X和Y方向上投影到多边形的相对侧,并在这些交叉点处创建新顶点。但是,对于以这种方式添加的每个新顶点,必须继续该过程。你可能会很幸运,并且这个过程会终止(因为已经有一个顶点适当地放在另一侧),但在一般情况下,它只会继续下去。

如果你抛弃这个限制,那么Neil N的建议对我来说似乎很好。

答案 4 :(得分:0)

我认为,尼尔N是对的。不幸的是他没有提供任何具体的链接。

如果你有一个顶部和底部与X轴平行的梯形,你可以用4个直角三角形轻松渲染。称这形状为水平梯形。

如果你有一个三边平行于X轴的三角形,你可以用2个直角三角形渲染它 - 或者你可以考虑梯形的退化情况,底部的顶部长度为零。

从凸包的顶部或底部开始(即搜索最小或最大y的坐标)并将其拆分为水平梯形。

编写代码并不困难,因此它与非凸多边形一样好。

答案 5 :(得分:0)

我认为在一般情况下这是不可能的。

考虑多边形{(0,1),(1,0),(2,0)}

.
 ..

如您所述,此三角形无法拆分为有限数量的三角形。