【问题标题】:How can a convex polygon be broken down into right triangles aligned on the X- and Y- axes?如何将凸多边形分解为在 X 轴和 Y 轴上对齐的直角三角形?
【发布时间】:2010-10-06 22:42:24
【问题描述】:

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

由于我可能缺少一些数学术语,“腿”就是我所说的那两条线,它们不是斜边(如果我在脸上刺伤了数学术语,请提前道歉 - - 简短的更正是额外的功劳)。

【问题讨论】:

  • 一张图片说一千个单词——用视觉辅助回答你的问题会容易得多。也许是一个带有标注的示例,指出您想要的几何图形?
  • 你想用这些直角三角形做什么?也许问题可以通过另一种方式解决?它让我想起了将世界空间中的点映射到窗口空间中的像素的过程,并增加了像素不是正方形的扭曲。

标签: math graphics geometry polygons


【解决方案1】:

我不确定这是否可能。考虑一个已经与 X 和 Y 轴的边对齐的正方形。如何使用同时与 X、Y 轴对齐的顶点绘制三角形?

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

【讨论】:

  • 在这种情况下,您将矩形分成两个三角形。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 我认为这仅在您不关心某些内部顶点是否位于边缘中间时才有效。在我的回答中,我认为这是不允许的......猜这个问题并没有禁止它。
    【解决方案4】:

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

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

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

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

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

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

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

    你已经完成了。

    【讨论】:

    • 这属于我一直在谈论的同一个问题。如果水平线不与另一个顶点相交,那么您必须在它相交的地方创建一个新顶点。然后你必须从那个新顶点创建一条新的垂直线,依此类推。
    • 但是没有“等等”。该垂直线段将始终与水平线段相交,并停在那里。我很确定这是可以证明的,尽管不在 cmets 允许的空间内。 :-)
    • 虽然我承认问题没有明确说明这一点,但这种事情通常的完成方式,不能就此止步。如果是这样,就会有一个 t-junction,在三角形边的中间有一个内部顶点。
    • 老实说,我无法接受通常的做法;我只是写了我知道会起作用的东西。至于三角形边中间的一个顶点,我不知道你指的是什么;我的设计会划分梯形,而不是三角形(在某些情况下,顶部和底部除外)。
    【解决方案5】:

    我认为尼尔 N 是对的。很遗憾他没有提供任何具体的链接。

    如果您有一个顶部和底部平行于 X 轴的梯形,您可以使用 4 个直角三角形轻松渲染它。将该形状称为水平梯形。

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

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

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

    【讨论】:

      【解决方案6】:

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

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

      .
       ..
      

      这个三角形不能像你描述的那样被分成有限数量的三角形。

      【讨论】:

        猜你喜欢
        • 2018-08-22
        • 1970-01-01
        • 2012-08-29
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 2018-11-25
        • 2012-06-11
        相关资源
        最近更新 更多