2010-01-04 94 views
-1

下面的函數返回具有給定半徑的球體上的點。我想增加限制,使點不能在球體的極點30度內繪製。範圍/限制內的球形座標

public static function randomPoint(radius:Number):Number3D 
{ 

    var inclination:Number = Math.random() * Math.PI*2; 
    var azimuth:Number = Math.random() * Math.PI*2; 

    var point:Number3D = new Number3D(
    radius * Math.sin(inclination) * Math.cos(azimuth), 
    radius * Math.sin(inclination) * Math.sin(azimuth), 
    radius * Math.cos(inclination) 
); 

    return point; 
} 

在此先感謝!

+2

隨時可以這樣做。有問題嗎? – 2010-01-04 03:01:01

+0

含義是我不知道如何添加這種限制功能。下次我會確保使用問號。感謝Nick Veys。 – Casey 2010-01-04 08:29:06

回答

2

聽起來像是你可以限制傾角:

var inclination:Number = (Math.PI/6) + Math.random()*(2*Math.PI-2*Math.PI/6) 

隨意解決這些常數值,只是不停地在他們表現出的工作。

+0

將傾向限制在30到120之間會讓我更加接近,但是現在我已經在左側和右側(0和180)限制了杆,並且我試圖限制頂部和底部(90和270) 。我試圖限制傾向0-60 || 120-180但這不起作用,它會在球體中間創建一個限制帶。請原諒我的無知......我所知道的是我在維基百科上閱讀的內容! – Casey 2010-01-04 06:50:24

+0

我想我可以使用旋轉矩陣來欺騙並重新定位我的受限制杆到頂部和底部,但它看起來效率不高 – Casey 2010-01-04 06:51:50

+0

您可能只需將限制交換爲方位角即可。我很難看出哪個軸被固定在我頭頂的哪個軸上。如果這不起作用,您或者需要改變方程式來指定要作爲Y軸角度測量的自由度之一,否則您需要該旋轉。 – 2010-01-04 10:27:58

0

這是我到目前爲止......這就是我想要的,限制南北兩極。任何改進歡迎!

var point:Number3D = sphericalPoint(100, inclination, azimuth); 

public static function sphericalPoint(r:Number, inc:Number, az:Number):Number3D 
{ 
    var point:Number3D = new Number3D(
     r * Math.sin(inc) * Math.cos(az), 
     r * Math.sin(inc) * Math.sin(az), 
     r * Math.cos(inc) 
    ); 

    //cheat and use a transform matrix 
    var obj:Object3D = new Object3D(); 
    obj.rotationX = 90; 

    point.rotate(point, obj.transform); 

    return point; 
} 

//a number between 0 and 180 
protected function get inclination():Number 
{ 
    //default 
    //_inclination = Math.random() * Math.PI; 

    //number between 60 and 120 
    _inclination = Math.random() * (Math.PI*5/6 - Math.PI/6) + Math.PI/6; 

    return _inclination; 
} 

//a number between 0 and 360 
protected function get azimuth():Number 
{ 
    //revolve around the Y axis 
    _azimuth = Math.random() * Math.PI*2; 

    return _azimuth; 
}