1 回答
TA貢獻1852條經(jīng)驗 獲得超1個贊
您當前正在從邊長為 2*max_distance_x、2*max_distance_y 和 2*max_distance_z 的平行六面體內(nèi)部隨機選擇一個點。讓我們假設這些都是相同的,并且等于您要在其表面上隨機選擇點的球體的半徑 r。然后,您的方法將從邊長為 2r 的立方體中隨機選擇。以這種方式選擇時,基本上您的隨機點實際上不會位于半徑為 r 的球體表面上。
但是 - 給定立方體中的一個點,你可以做的是:
計算從中心點到隨機點的向量(“增量”)。例如,如果您的中心點是 100,100,100,您的半徑是 100,您隨機選擇點 50,100,150,則您要查找的向量是 -50,0,50。
計算步驟 1 中向量的長度。這使用公式計算兩點之間的距離,擴展后考慮點的三個坐標:sqrt(dx^2 + dy^2 +dz^2)。例如,我們的距離是 sqrt((-50)^2 + 0^2 + 50^2) = sqrt(2500 + 0 + 2500) = 50sqrt(2)。
通過等于 r/d 的因子縮放來自步驟 1 的向量,其中 d 是在步驟 2 中確定的向量長度。對于我們的示例,我們將通過因子 r/d = 100/(50sqrt(2) ) = 2/平方根(2) = 平方根(2)。這給出 -50sqrt(2), 0, 50sqrt(2)。
現(xiàn)在,將步驟 3 中的縮放矢量添加到中心點,以在半徑為 r 的球體表面上得到一個點。在我們的示例中,球體表面上的點為 100-50sqrt(2)、100、100+50sqrt(2)。
現(xiàn)在唯一的問題是有些點比其他點更有可能被選中。這樣做的原因是球體表面上的一些點比其他點在它們外面有更多的立方體。具體來說,位于邊界立方體上的球體點在其外部沒有更遠的點,但是球體上與連接立方體中心及其角之一的線相交的點在球體外部有很多空間)。要獲得真正均勻的點分布,您需要排除隨機選擇的任何不在球體內(nèi)部或表面上的點。如果這樣做,您將通過上述方法獲得均勻分布的點數(shù)。因為立方體的體積是8r^3,球體的體積是4/3pir^3,又因為4/3pi~4,每次開獎時,您有大約 50% 的機會得到您必須放棄的分數(shù)。平均而言,您希望每兩次抽簽獲得一分。您通常不需要多次隨機抽獎才能獲得好獎,但從技術(shù)上講它是不受限制的。
如果你想確保每次隨機抽取都是好的,我可能建議隨機選擇 0 到 360 度之間的兩個角度。然后,使用這些角度來確定球體上的一個點。因此,例如,假設您首先繪制角度 p,然后繪制角度 q。角度 p 可以確定從中獲取點的平面。該平面將以圓形橫截面與球體相交。然后角度 q 可以確定該相交圓上的哪個點作為隨機點返回。假設這些角度給出點 (x', y', z')。出色地...
y' = r*sin(q) … since nothing else determines the y coordinate except q x' = r*cos(p)*cos(q) z' = r*sin(p)*cos(q)
這具有不需要拒絕任何隨機樣本的優(yōu)點,以及需要相對更昂貴的三角運算的缺點。
編輯:每種方法的偽代碼
方法一:
RandomPointOnSphere(centerX, centerY, centerZ, radius)
1. x = random(-radius, radius)
2. y = random(-radius, radius)
3. z = random(-radius, radius)
4. dx = x - centerX
5. dy = y - centerY
6. dz = z - centerZ
7. dd = sqrt(dx*dx + dy*dy + dz*dz)
8. if dd > radius then return RandomPointOnSphere(centerX, centerY, centerZ, radius)
9. dx = radius * dx / dd
10. dy = radius * dy / dd
11. dz = radius * dz / dd
12. return (centerX + dx, centerY + dy, centerZ + dz)
方法二:
RandomPointOnSphere(centerX, centerY, centerZ, radius)
1. angleP = random(0, 359)
2. angleQ = random(0, 359)
3. dx = radius* cos(angleP) * cos(angleQ)
4. dy = radius * sin(angleQ)
5. dz = radius * sin(angleP) * cos(angleQ)
6. return (centerX + dx, centerY + dy, centerZ + dz)
- 1 回答
- 0 關(guān)注
- 224 瀏覽
添加回答
舉報
