Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何在另一个多边形内拟合多边形_Algorithm - Fatal编程技术网

Algorithm 如何在另一个多边形内拟合多边形

Algorithm 如何在另一个多边形内拟合多边形,algorithm,Algorithm,我有两个多边形,如下图所示。 左边是“粗糙多边形”,右边是“最终多边形” 现在,我正在寻找算法,以最佳最大比例拟合“粗糙多边形”中的“最终多边形”。 您可以任意旋转和平移“最终多边形”。 无法执行单个x维度或y维度缩放。 只能执行均匀缩放(其中Sx和Sy的值相同)。 将右侧多边形缩放0.01。(几何) 开始快速旋转,使其画出圆圈。(几何) 开始将比例0.01增加0.01。(几何) 当它接触到外部多边形时停止。(几何) 然后反弹到相反的方向,直到它再次反弹。(物理) 一次又一次。(迭代) 直到

我有两个多边形,如下图所示。
左边是“粗糙多边形”,右边是“最终多边形”

现在,我正在寻找算法,以最佳最大比例拟合“粗糙多边形”中的“最终多边形”。

  • 您可以任意旋转和平移“最终多边形”。
  • 无法执行单个x维度或y维度缩放。
  • 只能执行均匀缩放(其中Sx和Sy的值相同)。


将右侧多边形缩放0.01。(几何)

开始快速旋转,使其画出圆圈。(几何)

开始将比例0.01增加0.01。(几何)

当它接触到外部多边形时停止。(几何)

然后反弹到相反的方向,直到它再次反弹。(物理)

一次又一次。(迭代)

直到它无法再次移动/反弹。(最佳卡住)(物理)


如果出现错误的局部解,请使用模拟退火。(您需要全局解)

将右侧多边形缩放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想要的。此外,什么可以保证它第一次碰撞时会处于最佳的展开角度?那么从某个高度释放一个多边形呢