第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 Sphere Loc 和 Radius 獲取 Sphere 表面上的隨機(jī) XYZ

從 Sphere Loc 和 Radius 獲取 Sphere 表面上的隨機(jī) XYZ

PHP
肥皂起泡泡 2023-03-11 15:31:51
我試圖根據(jù) XYZ 中的球體中心和 PHP 中的半徑來獲取球體表面上的隨機(jī) XYZ 坐標(biāo)。目前,我的系統(tǒng)純粹是隨機(jī)的,希望在行星中心有一個位置。我不擅長數(shù)學(xué),所以請多多包涵(計(jì)算障礙和閱讀障礙)?,F(xiàn)在我只是隨機(jī)混亂如下(注意 randint 是一個自定義函數(shù),它檢查rand_int,mt_rand并rand使用最新的。            $nx = randint( abs( $poo['x'] - $max_distance_x ), abs( $poo['x'] + $max_distance_x ) );            $ny = randint( abs( $poo['y'] - $max_distance_y ), abs( $poo['y'] + $max_distance_y ) );            $nz = randint( abs( $poo['z'] - $max_distance_z ), abs( $poo['z'] + $max_distance_z ) );但我有行星 radius$pradius和行星 XYZ 中心陣列 $poo poo(x, y, z),我想我可以獲得隨機(jī)表面 XYZ,只是不確定。我看過其他語言,但無法理解要移植的任何內(nèi)容。更新基于答案中提供的兩種方法,我想出了以下兩個功能。但是兩者都無法正常運(yùn)行。以下函數(shù)僅在小行星(北極)的頂部產(chǎn)生隕石坑(點(diǎn)),即使它應(yīng)該從其半徑處的小行星中心計(jì)算。function basic_spheroid_point( $cx, $cy, $cz, $r ) {    $x = randint(-$r, $r);    $y = randint(-$r, $r);    $z = randint(-$r, $r);    $dx = $x - $cx;    $dy = $y - $cy;    $dz = $z - $cz;    $dd = sqrt( ( $dx * $dx ) + ( $dy * $dy ) + ( $dz * $dz ) );    if ( $dd > $r )        return basic_spheroid_point( $cx, $cy, $cz, $r );    $dx = $r * $dx / $dd;    $dy = $r * $dy / $dd;    $dz = $r * $dz / $dd;    return array( $cx + $dx, $cy + $dy, $cz + $dz );}這個函數(shù)在地球的北極聚集了隕石坑,盡管也有全球覆蓋的隕石坑,所以它部分起作用。function uniform_spheroid_point($cx, $cy, $cz, $r) {    $ap = randint( 0, 359 );    $aq = randint( 0, 359 );    $dx = $r* cos( $ap ) * cos( $aq );    $dy = $r * sin( $aq );    $dz = $r * sin( $ap ) * cos( $aq );    return array( $cx + $dx, $cy + $dy, $cz + $dz ); } 
查看完整描述

1 回答

?
小怪獸愛吃肉

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個贊

您當(dāng)前正在從邊長為 2*max_distance_x、2*max_distance_y 和 2*max_distance_z 的平行六面體內(nèi)部隨機(jī)選擇一個點(diǎn)。讓我們假設(shè)這些都是相同的,并且等于您要在其表面上隨機(jī)選擇點(diǎn)的球體的半徑 r。然后,您的方法將從邊長為 2r 的立方體中隨機(jī)選擇。以這種方式選擇時,基本上您的隨機(jī)點(diǎn)實(shí)際上不會位于半徑為 r 的球體表面上。

但是 - 給定立方體中的一個點(diǎn),你可以做的是:

  1. 計(jì)算從中心點(diǎn)到隨機(jī)點(diǎn)的向量(“增量”)。例如,如果您的中心點(diǎn)是 100,100,100,您的半徑是 100,您隨機(jī)選擇點(diǎn) 50,100,150,則您要查找的向量是 -50,0,50。

  2. 計(jì)算步驟 1 中向量的長度。這使用公式計(jì)算兩點(diǎn)之間的距離,擴(kuò)展后考慮點(diǎn)的三個坐標(biāo):sqrt(dx^2 + dy^2 +dz^2)。例如,我們的距離是 sqrt((-50)^2 + 0^2 + 50^2) = sqrt(2500 + 0 + 2500) = 50sqrt(2)。

  3. 通過等于 r/d 的因子縮放來自步驟 1 的向量,其中 d 是在步驟 2 中確定的向量長度。對于我們的示例,我們將通過因子 r/d = 100/(50sqrt(2) ) = 2/平方根(2) = 平方根(2)。這給出 -50sqrt(2), 0, 50sqrt(2)。

  4. 現(xiàn)在,將步驟 3 中的縮放矢量添加到中心點(diǎn),以在半徑為 r 的球體表面上得到一個點(diǎn)。在我們的示例中,球體表面上的點(diǎn)為 100-50sqrt(2)、100、100+50sqrt(2)。

現(xiàn)在唯一的問題是有些點(diǎn)比其他點(diǎn)更有可能被選中。這樣做的原因是球體表面上的一些點(diǎn)比其他點(diǎn)在它們外面有更多的立方體。具體來說,位于邊界立方體上的球體點(diǎn)在其外部沒有更遠(yuǎn)的點(diǎn),但是球體上與連接立方體中心及其角之一的線相交的點(diǎn)在球體外部有很多空間)。要獲得真正均勻的點(diǎn)分布,您需要排除隨機(jī)選擇的任何不在球體內(nèi)部或表面上的點(diǎn)。如果這樣做,您將通過上述方法獲得均勻分布的點(diǎn)數(shù)。因?yàn)榱⒎襟w的體積是8r^3,球體的體積是4/3pir^3,又因?yàn)?/3pi~4,每次開獎時,您有大約 50% 的機(jī)會得到您必須放棄的分?jǐn)?shù)。平均而言,您希望每兩次抽簽獲得一分。您通常不需要多次隨機(jī)抽獎才能獲得好獎,但從技術(shù)上講它是不受限制的。

如果你想確保每次隨機(jī)抽取都是好的,我可能建議隨機(jī)選擇 0 到 360 度之間的兩個角度。然后,使用這些角度來確定球體上的一個點(diǎn)。因此,例如,假設(shè)您首先繪制角度 p,然后繪制角度 q。角度 p 可以確定從中獲取點(diǎn)的平面。該平面將以圓形橫截面與球體相交。然后角度 q 可以確定該相交圓上的哪個點(diǎn)作為隨機(jī)點(diǎn)返回。假設(shè)這些角度給出點(diǎn) (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)

這具有不需要拒絕任何隨機(jī)樣本的優(yōu)點(diǎn),以及需要相對更昂貴的三角運(yùn)算的缺點(diǎn)。

編輯:每種方法的偽代碼

方法一:

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)


查看完整回答
反對 回復(fù) 2023-03-11
  • 1 回答
  • 0 關(guān)注
  • 202 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號