您可以做到的一種方法是以帶有三角形側面的柏拉圖式固體開始 - 例如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球體,你可以排序的看到工作中這種技術。這是一個十二面體,凸出的臉讓它看起來更圓。
查找數學解釋的球座標(特別是從球座標到笛卡爾座標的轉換)。 –