给定一个由一组顶点表示的凸多边形(我们可以假设它们按逆时针顺序排列),如何将该多边形分解为一组与X轴和Y轴对齐的直角三角形?
由于我可能缺乏一些数学术语,"腿"是我所说的那两条线,它们不是斜边(提前道歉如果我用错误的数学术语,请指正)。
给定一个由一组顶点表示的凸多边形(我们可以假设它们按逆时针顺序排列),如何将该多边形分解为一组与X轴和Y轴对齐的直角三角形?
由于我可能缺乏一些数学术语,"腿"是我所说的那两条线,它们不是斜边(提前道歉如果我用错误的数学术语,请指正)。
我不确定是否要编写算法来完成这个任务,但在纸上对于任何凸多边形似乎都是完全可能的。对于每个顶点,从该顶点垂直或水平投射一条线,直到它与另一条垂直或水平线相交。对于角度变化小的顶点,其中相邻的边在x和y方向上都朝着同一个方向移动,您需要从该顶点添加两条线,一条水平线和一条垂直线。 完成此操作后,您应该会得到一个位于原始多边形中心的多边形,但其边缘是由从原始多边形的顶点绘制的线条形成的,因此这些边缘要么是垂直的,要么是水平的。由于这些边缘要么是垂直的,要么是水平的,因此可以将此形状轻松地分成许多三角形,其中包含一条水平边,一条垂直边和一条斜边。
我假设您已按照上述描述订购了顶点,并且它们确实定义了一个凸多边形。
每个顶点都定义了一条水平线。 对于 V 个顶点,您将拥有一组 V 条线。 放弃满足以下任何条件的任何线:
结果将类似于多边形的“带状”。
每条水平线与多边形相交于两个点。 其中一个是其定义的顶点。 另一个要么是另一个顶点,要么是由两个顶点定义的线段上的点。 您可以很容易地确定哪种情况 - 只需简单比较 Y 坐标即可。 与线段相交的坐标也很容易计算,我将其留给您。
每个交点定义了一个垂直线段。该线段包含在多边形内(如果它与一条边重合,可以丢弃它),另一端与另一条水平线相交,或者如果该边本身是水平的,则与多边形的边缘相交。确定这种情况再次只是比较坐标的问题。最后,如果只有其中之一,则可能会有0-2个额外的垂直线段,由具有最高和/或最低Y坐标的顶点定义。
现在的图表显示了每个带有一个右三角形被修剪掉的末端的带子。每个三角形都应符合您的标准。剩余区域是矩形;画一条任意对角线将每个矩形分成两个符合您标准的直角三角形。
您完成了。
我认为一般情况下这是不可能的。
考虑多边形 {(0, 1), (1, 0), (2, 0)}
.
..
你所描述的这个三角形无法被分割成有限数量的三角形。
我不确定这是否可能。想象一下一个已经与X轴和Y轴的边对齐的正方形。如何使用顶点绘制也与X、Y轴对齐的三角形呢?
或者多边形的实际边缘是否允许沿着x、y轴。这意味着你可以沿着正方形的对角线画一条线。如果是这样,那么在更复杂的多边形中,有些边缘与轴对齐,而其他边缘则不对齐,这可能会很困难。
我不确定是否有一种通用的解决方案来回答这个问题。问题在于需要对齐X轴和Y轴。这意味着每个顶点都需要在X和Y方向上投影到多边形的相反侧,并在这些交点处创建新的顶点。但是,这个过程必须继续进行,直到添加的每个新顶点都满足要求。您可能会走运并且该过程会终止(因为已经有一个适当放置在对面的顶点),但在一般情况下,它将不断地继续。
如果您放弃这个限制,那么Neil N的建议对我来说似乎很好。
我认为Neil N是正确的,不幸的是他没有提供任何具体的链接。
如果你有一个梯形,其顶部和底部平行于X轴,你可以用4个直角三角形轻松渲染它。把这个形状称为水平梯形。
如果你有一个三角形,其中一条边平行于X轴,你可以用2个直角三角形来渲染它--或者你可以考虑一个特殊情况,即顶部或底部长度为零的梯形。
从凸包的顶部或底部开始(即搜索具有最小或最大y坐标的坐标),并将其分成水平梯形。
编写代码使其能够与非凸多边形一样有效并不难。