Algorithm 如何在另一个多边形内拟合多边形
我有两个多边形,如下图所示。Algorithm 如何在另一个多边形内拟合多边形,algorithm,Algorithm,我有两个多边形,如下图所示。 左边是“粗糙多边形”,右边是“最终多边形” 现在,我正在寻找算法,以最佳最大比例拟合“粗糙多边形”中的“最终多边形”。 您可以任意旋转和平移“最终多边形”。 无法执行单个x维度或y维度缩放。 只能执行均匀缩放(其中Sx和Sy的值相同)。 将右侧多边形缩放0.01。(几何) 开始快速旋转,使其画出圆圈。(几何) 开始将比例0.01增加0.01。(几何) 当它接触到外部多边形时停止。(几何) 然后反弹到相反的方向,直到它再次反弹。(物理) 一次又一次。(迭代) 直到
左边是“粗糙多边形”,右边是“最终多边形” 现在,我正在寻找算法,以最佳最大比例拟合“粗糙多边形”中的“最终多边形”。
- 您可以任意旋转和平移“最终多边形”。
- 无法执行单个x维度或y维度缩放。
- 只能执行均匀缩放(其中Sx和Sy的值相同)。
如果出现错误的局部解,请使用模拟退火。(您需要全局解)将右侧多边形缩放0.01。(几何) 开始快速旋转,使其画出圆圈。(几何) 开始将比例0.01增加0.01。(几何) 当它接触到外部多边形时停止。(几何) 然后反弹到相反的方向,直到它再次反弹。(物理) 一次又一次。(迭代) 直到它无法再次移动/反弹。(最佳卡住)(物理)
如果存在错误的局部解,则使用模拟退火。(您需要全局解)这里有一个可能的攻击线,通过穷举试验获得精确解;只是想法 我的猜测是,当有三个联系人时,就实现了解决方案。我的意思是,多边形的三个顶点,或者与另一个多边形的边相接触,或者相反。(如果接触少于三个,则可以膨胀内部多边形,使其进入第三个接触。) 给定两个任意三角形,找到所有可能的三个接触位置应该不会那么困难 因此,全局方案是从一个多边形获取所有顶点/边的三元组,并获取另一个多边形的所有边/顶点的互补三元组。对于每一个组合,暂时考虑你有三角形,并找到可能的三个接触位置。对于每个候选位置,检查内部多边形是否限制在外部多边形中。最后,保持比例因子最大的容许解
对于侧面为
N
和M
的多边形,将有O(N³M³)
配置可供尝试,并且安全壳测试的成本可能与O(NM)
一样高。因此,这种方法只适用于非常小的多边形。这里有一个可能的攻击线,通过详尽的试验获得精确的解决方案;只是想法
我的猜测是,当有三个联系人时,就实现了解决方案。我的意思是,多边形的三个顶点,或者与另一个多边形的边相接触,或者相反。(如果接触少于三个,则可以膨胀内部多边形,使其进入第三个接触。)
给定两个任意三角形,找到所有可能的三个接触位置应该不会那么困难
因此,全局方案是从一个多边形获取所有顶点/边的三元组,并获取另一个多边形的所有边/顶点的互补三元组。对于每一个组合,暂时考虑你有三角形,并找到可能的三个接触位置。对于每个候选位置,检查内部多边形是否限制在外部多边形中。最后,保持比例因子最大的容许解
对于侧面为
N
和M
的多边形,将有O(N³M³)
配置可供尝试,并且安全壳测试的成本可能与O(NM)
一样高。因此,这种方法只适用于非常小的多边形。多边形是凸的吗?@cerkiewny你可以自己看到,它们不一定是凸的。听起来像是某种包装问题。。。你有没有研究过包装不规则形状的算法?这可能是相关的,你可能会得到一些灵感,例如,将形状近似为由较小的正方形组成,以简化问题。我想,虽然这个问题不是确定性的,所以你可能不得不寻找一个“足够好”的解决方案,而不是真正的解决方案。@cerkiewny hahaha pr0n polygon…这些多边形是凸的吗?@cerkiewny你可以自己看到,它们不一定是。听起来像是某种包装问题。。。你有没有研究过包装不规则形状的算法?这可能是相关的,你可能会得到一些灵感,例如,将形状近似为由较小的正方形组成,以简化问题。我想,虽然这个问题不是确定性的,所以你可能不得不寻找一个“足够好”的解决方案,而不是真正的解决方案。@cerkiewny hahaha pr0n polygon…哈哈,开始快速旋转,你的手开始痛了。基本上你是在暗示一个不聪明的,可能不准确的,通过尝试和失败找到答案的暴力方法。我认为这不是OP想要的。此外,什么能保证它第一次碰撞时处于最佳展开角度?从某个高度释放一个多边形,然后让它落在另一个多边形的顶部如何。试了1000次,得到了最合适的?(通过不同的缩放,物理会自动处理其他变化)哈哈,开始旋转得如此之快,以至于你的手开始痛。基本上,你是在建议一种不聪明、可能不准确、暴力的方法,通过尝试和失败来寻找答案。我认为这不是OP想要的。此外,什么可以保证它第一次碰撞时会处于最佳的展开角度?那么从某个高度释放一个多边形呢