我试图设计一种方法来生成随机2D凸多边形。它必须具有以下属性:如何生成随机凸多边形?
- 坐标应该是整数;
- 多边形应该位于具有角(0,0)和(C,C)的正方形内,其中C是给定的;
- 多边形应该具有接近于给定数目N.
例如顶点的数目,产生具有10个顶点并位于正方形[0..100]×内随机多边形[0..100] 。
是什么让这项任务变得困难,是坐标应该是整数。
我尝试的方法是在给定的正方形中生成随机点集并计算这些点的凸包。但由此产生的凸包与N相比是非常小的顶点。
任何想法?
我试图设计一种方法来生成随机2D凸多边形。它必须具有以下属性:如何生成随机凸多边形?
例如顶点的数目,产生具有10个顶点并位于正方形[0..100]×内随机多边形[0..100] 。
是什么让这项任务变得困难,是坐标应该是整数。
我尝试的方法是在给定的正方形中生成随机点集并计算这些点的凸包。但由此产生的凸包与N相比是非常小的顶点。
任何想法?
这不完全,但它可能会给你一些想法。
如果出现N则退出< 3.生成一个包含N个顶点的单位圆,并随机旋转[0..90]度。
从原点向外随机地挤出每个顶点,并使用每对相邻顶点与原点之间的叉积符号来确定凸度。这是在速度和质量之间进行权衡的步骤。
获得顶点后,找到具有来自原点的最大量级的顶点。将每个顶点除以该量值以对多边形进行归一化,然后按(C/2)进行缩放。转换为(C/2,C/2)并转换回整数。
一个简单的算法是:
如何支持整数坐标? – Jasiu
@Jasiu:我不明白它怎么可能不支持整数坐标。只需计算整数中的所有生成点并将结果限制在所需的范围内即可。 –
您最初的做法是正确的 - 计算的凸包是你能满足随机性,凸性和integerness的唯一途径。
我认为优化算法以获得“更多点”的唯一方法是将它们围绕一个圆圈而不是完全随机地进行组织。你的积分应该更接近你的正方形的“边缘”而不是靠近中心。在中心,概率应该是〜0,因为多边形必须是凸的。
一个简单的选项是设置出现点的最小半径 - 可能是C/2或C * 0.75。计算C平方的中心,如果一个点太靠近,将它从中心移开,直到达到最小距离。
这是我知道的最快的算法,它以相等的概率生成每个凸多边形。输出具有N个顶点,运行时间为O(N log N),所以它可以非常快地生成更大的多边形。
X
和Y
,N随机整数介于0和C.确保有没有重复。X
和Y
并存储它们的最大和最小元素。X1
和X2
,以及Y1
和Y2
。minX
,开头为X1
和X2
,maxX
,最后等)。X1[i + 1] - X1[i]
),颠倒第二组订单(X2[i] - X2[i + 1]
)。将它们存储在列表XVec
和YVec
中。YVec
并将每一对XVec[i]
和YVec[i]
视为一个2D矢量。动画和Java实现在这里可用:Generating Random Convex Polygons。
该算法基于Pavel Valtr的论文:“Probability that n random points are in convex position”。离散&计算几何13.1(1995):637-643。
下面是关于凸度测试的更多信息的链接: http://www.gamedev.net/topic/561441-polygon-convexity-test-cant-get-it-right/ – scgrn
这适用于浮点坐标。你如何确保当你回到整数时,多边形不会变成凹面?您可以移除有问题的顶点,但这可能会显着减少顶点的数量。 – Jasiu