找到不规则(非凸)形状的稳定放置

时间:2010-06-19 03:42:29

标签: algorithm physics

给定一个二维不规则(非凸)形状的图像,我怎样才能计算出它在平面上稳定的所有方式?例如,如果形状是一个完美的方形矩形,那么它肯定有4种稳定方式。另一方面,圆圈没有稳定的方向,或者每个点都是稳定的方向。

编辑:有一个名为Splitter的小游戏(小心,上瘾的游戏)似乎接近我想要的。注意到你砍掉了一块木头,它会掉到地上并以稳定的方式放置。

编辑:最后,我采用的方法是计算质心(形状)并计算凸包(使用OpenCV),然后遍历每对顶点。如果质心落在由2个顶点形成的线的顶部,则认为是稳定的,否则,不是。

3 个答案:

答案 0 :(得分:9)

首先找到它的质心(CM)。如果轻微旋转,稳定位置是CM将更高的位置。现在看看船体,它是包围形状的最小凸起区域:

Convex Hull and Centre of Mass http://walkytalky.net/extern/hull.png

如果船体是多边形,那么稳定的位置是其中一个侧面上的形状搁置的位置,并且CM直接位于该侧面上方(不一定在侧面的中点上方,仅在其上方的某处)

如果船体有曲线(即,如果形状有接触船体的曲线),则必须给予特殊处理。如果CM直接位于曲线的最低点之上,那么当在曲线边缘上休息时,形状将是稳定的,并且该点处的曲线半径大于CM的高度。

示例:

  1. 一个矩形。船体只是矩形,CM位于中心。形状在四个边的每一边都是稳定的。
  2. 一个边框挖空的矩形,但角落仍然完好无损。船体仍然是原始的矩形,CM接近以前的位置。船体的所有四个侧面仍然稳定(也就是说,您仍然可以将形状放在任何两个角上)。
  3. 一个圆圈。 CM位于中心,船体是圆形。没有稳定的位置,因为曲线的半径总是等于CM的高度。给它轻微的触摸,它会滚动。
  4. 一个椭圆。 CM位于中心,船体是形状。现在有两个稳定的位置。
  5. 半圆形。 CM位于对称轴上的某个位置,船体就是形状。两个稳定的位置。
  6. 狭窄的半圆形新月形。船体是半圆形,CM在形状之外(但在船体内)。两个稳定的位置。

Illustration of the examples http://walkytalky.net/extern/stable.png

(标有X的椭圆位置不稳定,因为曲率小于到质心的距离。)

答案 1 :(得分:3)

注意:此答案假设您的形状是正确的多边形。

出于我们的目的,我们将平衡位置定义为质心直接位于对象的最左侧和最右侧地面接触点之间的点(假设地面是垂直于重力的平坦表面。这适用于所有形状的所有情况。

请注意,这实际上是旋转平衡的physical definition,这是牛顿旋转运动学的结果。

对于正确的多边形,如果我们消除它们站在唯一顶点的情况,则此定义等同于稳定位置。

所以,如果你有一个直线向下的引力,首先找到它的最左边和最右边的部分接触地面。

然后,计算您的质心。对于具有已知顶点和均匀密度的多边形,此问题将减少为找到Centroidrelevant section)。

然后,从你的CoM中删除一行;如果CoM和地面的交点在这两个x值之间,则它处于平衡状态。

如果你的最左边的点和最右边的点匹配(即在一个圆形物体中),这仍然会成立;只记得要小心你的浮点数比较。

请注意,这也可用于测量物体的“稳定性” - 此度量是质心不再在两个接触点范围内之前可以移动的最大y距离。 / p>

编辑:匆忙的图表匆匆

Diagram http://img52.imageshack.us/img52/9506/1276930988102131dc.png

那么,你如何使用它来找到它可以放在桌子上的所有方式?参见:


修改

可编程方法

而不是旋转形状的计算成本高昂的任务,而是试试这个。

你的程序中的形状表示应该包含所有顶点的列表。

找到你的形状convex hull的顶点(基本上,你的形状,但所有凹顶点 - 被“推入”的顶点 - 消除)。

然后迭代你的凸包上的每对相邻顶点(即,如果我有顶点A,B,C,D,我会迭代AB,BC,CD,DA)

做这个测试:

  1. 通过正在测试的两个顶点画一条 A
  2. 画一条垂直于 A 的线,经过CoM C
  3. 找到两条线的交集(简单代数)
  4. 如果交点的y值介于两个顶点的y值之间,则它是稳定的。如果y值全部相等,则比较x值。
  5. 这应该可以解决问题。

    以下是在一对顶点上运行测试的示例:

    Example test http://img17.imageshack.us/img17/918/stabled.png

    如果你的形状没有在数据结构中用它的顶点表示,那么你应该尝试转换它们。如果它类似于圆形或椭圆形,您可以使用启发式方法来猜测答案(圆圈具有无限平衡位置;椭圆形4,尽管只有两个“稳定”点)。如果它是一个弯曲的摇摆不规则形状,你将不得不为我提供数据结构能够以程序相关的方式提供帮助,而不是仅仅提供逐案启发式。

答案 2 :(得分:0)

我确定这不是最有效的算法,但这是一个想法。

如果您可以订购多边形的顶点(假设它具有有限数量的顶点),那么只需迭代相邻的顶点对,并通过某种形式的模拟记录它所依赖的角度。在奇怪的形状(如星星)的情况下,它会有重复的方向,但你可以通过跟踪静止的旋转来适应它。