您可以做到的一种方法是以带有三角形侧面的柏拉图式固体开始 - 例如octahedron。然后,取每个三角形和递归地把它分解成更小的三角形,像这样:
一旦你有了点足量,你规范自己的载体,使他们从中心所有的距离不变的固体。这会导致两侧凸出成类似于球体的形状,并随着增加点数而增加平滑度。
这里的标准化意味着移动一个点,使其相对于另一个点的角度相同,但它们之间的距离是不同的。 这是一个二维的例子。
A和B是隔开6个单位。但假设我们想找到AB线点是从A 12个单位处
我们可以说,C是B上相对于A的归一化的形式,距离12我们可以得到下用这样的代码:
#returns a point collinear to A and B, a given distance away from A.
function normalize(a, b, length):
#get the distance between a and b along the x and y axes
dx = b.x - a.x
dy = b.y - a.y
#right now, sqrt(dx^2 + dy^2) = distance(a,b).
#we want to modify them so that sqrt(dx^2 + dy^2) = the given length.
dx = dx * length/distance(a,b)
dy = dy * length/distance(a,b)
point c = new point
c.x = a.x + dx
c.y = a.y + dy
return c
如果我们这样做归一化处理上一分不少,都相对于同一A点和相同的距离为R,则归一化的积分将全部趴在弧形中心A和半径为R的圆圈。
在这里,黑点从一条线开始并“凸出”成一条弧线。
这个过程可以扩展到三个维度,在这种情况下,你会得到一个球体而不是一个圆。只需在normalize函数中添加一个dz组件即可。
如果你看一下在Epcot球体,你可以排序的看到工作中这种技术。这是一个十二面体,凸出的脸让它看起来更圆。
查找数学解释的球坐标(特别是从球坐标到笛卡尔坐标的转换)。 –