【问题标题】:Draw arbitrary convex shape knowing the lengths of its sides绘制任意凸形状,知道其边长
【发布时间】:2015-09-03 08:37:07
【问题描述】:

我有一个值列表,它们是任意凸形(多边形)的边长。 我怎样才能画出这个形状?什么算法可以帮助我完成这项任务?

例如,我有一个列表:2、5、2、3。绘图必须如下所示:

【问题讨论】:

    标签: drawing draw polygon shapes convex


    【解决方案1】:

    对此有一个相对简单的(如果有点数学题的话)O(N log N) to O(N^2) (depending on implementation) 基于递归几何/三角函数的解决方案。

    1. 这个概念从长度等于长度总和的线段开始。
    2. 将该线段分成三角形(参见底部附近的相关信息)。
    3. 根据需要递归地将三角形的每条边分成更多的三角形。

    第 2 步,要求确保三角形的较小两条边比较大的一条长。

    第3步,可以将一个三角形变成2个三角形。

    对于我将使用的输入和输出: 输入:边列表 输出:内角列表。

    所以output[a] 是在input[a] 的边之前的顶点的内角。

    一个很好的参考是located here

    • 方法 #1 gif,显示那么多顶点的三角形。
    • 方法 #2 gif,P 是第 2 步中可能发生中断的示例。
    • 方法#4 gif,此处的P 可以被视为像#3 中一样移出,请注意,在这种情况下,行长不会按比例缩放,实际上是未知的。请注意,只有a1a2 的顶点位置会改变。导致a1a2 前后顶点的内角发生变化。在这种情况下,a1,a2,a3,an,p

    关于确定内角。使用三角学和/或几何学。给定三角形的 3 条边,可以确定角度是多少。给定 2 个边和一个角度(或 1 个角度和 2 个边),可以确定缺少的边和角度。

    当然,您可能必须小心在哪里打破边缘,以便形成三角形。

    【讨论】:

    • 对于看到此内容的其他人:随意发布另一个包含数学和/或实际算法的答案。如果我看到他们,我可能会支持那些这样做的人。
    【解决方案2】:

    我会在这里引用an answer I posted on MathOverflow:

    如果最长边不长于所有其他边的长度之和,则边链可以闭合。

    在您的示例中,最长边为 5,并且不超过 2+2+3=7。 如果将长度为 5 的边替换为长度为 8 的边,则四个段 不能接近凸多边形。 每当您有超过 3 条边时,生成的凸多边形不是 独特的确定性:它的形状具有灵活性。

    有关证明的指针,请参阅上面引用的参考资料。

    【讨论】:

    • 您的评论实际上并没有回答我的问题,但提供的链接非常有帮助。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2014-10-14
    • 2019-02-20
    • 2019-08-17
    相关资源
    最近更新 更多