2014-03-25 48 views

回答

1

根据定义,球体表面上的一组点是凸的。

生成随机分布在单位球面上的一组n个点,得到凸包,找到面积并根据需要缩放以获得目标区域。

编辑:我可能误读了;你说3d,所以我认为你的意思是3D多面体;如果你实际上是指二维多边形,使它成为一个单位圆而不是一个球体,并且你也可以使这些点间隔相等(即正多边形)。

EDIT2:如果我们假设具有N个侧面和区域A内的2D正多边形,我们可以计算出外接圆ř直接:

http://www.mathopenref.com/polygonregulararea.html

A = 0.5 * R**2 * N * sin(2*pi/N) 

重排,

R = sqrt(2*A/(N * sin(2*pi/N))) 

我们可以把它变成一个函数,

from math import pi, sin, cos, sqrt 

def circumradius(a, n): 
    return sqrt(2.*a/(n * sin(2.*pi/n))) 

让我们从一个已知的对象测试,一个单位正方形:

circumradius(1, 4) # => 0.7071067 

为1/SQRT(2),正确的中心到角落的距离为一个单位正方形。

然后我们就可以生成顶点,

def make_polygon(a, n): 
    R = circumradius(a, n) 
    pts = [] 
    for i in range(n): 
     theta = i * 2.*pi/n 
     pts.append((R * sin(theta), R * cos(theta))) 
    return pts 

make_polygon(1, 4) 
    # => [(0., 0.7071), (0.7071, 0.), (0., -0.7071), (-0.7071, 0.)]