三維直角坐標系

三維直角坐標系是一種利用直角坐標(x,y,z)來表示一個點 P 在三維空間的位置的三維正交坐標系。
注:本文所討論的三維直角坐標系,默認其x-軸、y-軸、z-軸滿足右手定則(如右圖所示)。
在三維空間的任何一點 P ,可以用直角坐標(x,y,z)來表達其位置。如左下圖顯示了三維直角坐標的幾何意義:點P在x-軸、y-軸、z-軸上的投影距離分別為x、y、z。如右下圖所示,兩個點 P 與 Q 的直角坐標分別為(3,0,5)與(-5,-5,7) 。


球坐標系
球坐標系是一種利用球坐標(r,θ,φ)來表示一個點 P 在三維空間的位置的三維正交坐標系。
下圖描述了球坐標的幾何意義:原點O與目標點P之間的徑向距離為r,O到P的連線與正z-軸之間的夾角為天頂角θ,O到P的連線在xy-平面上的投影線與正x-軸之間的夾角為方位角φ。

假設 P 點在三維空間的位置的三個坐標是
。那么, 0 ≤ r 是從原點到 P 點的距離, 0 ≤ θ ≤ π 是從原點到 P 點的連線與正 z-軸的夾角, 0 ≤ φ < 2π 是從原點到 P 點的連線在 xy-平面的投影線,與正 x-軸的夾角。當
時,
與
都一起失去意義。當
或
時,
失去意義。
三維空間下直角坐標與球坐標的相互轉換
直接坐標轉球坐標
、
、
。
球坐標轉直角坐標
、
、
。
基於Flex的坐標轉換實現
直角坐標定義類CartesianCoord.cs
package hans_gis.coord
{
public class CartesianCoord
{
public var x:Number;
public var y:Number;
public var z:Number;
static private var temp:CartesianCoord = CartesianCoord.ZERO;
public function CartesianCoord(x:Number=0, y:Number=0, z:Number=0)
{
this.x = x;
this.y = y;
this.z = z;
}
public function clone():CartesianCoord
{
return new CartesianCoord(this.x, this.y, this.z);
}
public function copyTo(n:CartesianCoord):void
{
n.x = this.x;
n.y = this.y;
n.z = this.z;
}
public function copyFrom(n:CartesianCoord):void
{
this.x = n.x;
this.y = n.y;
this.z = n.z;
}
public function reset(newx:Number = 0, newy:Number = 0, newz:Number = 0):void
{
this.x = newx;
this.y = newy;
this.z = newz;
}
static public function get ZERO():CartesianCoord
{
return new CartesianCoord(0, 0, 0);
}
}
}
球坐標定義類SphericalCoord.cs
package hans_gis.coord
{
public class SphericalCoord
{
public var radius:Number;
public var theta:Number;
public var phi:Number;
static private var temp:SphericalCoord = SphericalCoord.ZERO;
public function SphericalCoord(radius:Number=0, theta:Number=0, phi:Number=0)
{
this.radius = radius;
this.theta = theta;
this.phi = phi;
}
public function clone():SphericalCoord
{
return new SphericalCoord(this.radius, this.theta, this.phi);
}
public function copyTo(n:SphericalCoord):void
{
n.radius = this.radius;
n.theta = this.theta;
n.phi = this.phi;
}
public function copyFrom(n:SphericalCoord):void
{
this.radius = n.radius;
this.theta = n.theta;
this.phi = n.phi;
}
public function reset(newradius:Number = 0, newtheta:Number = 0, newphi:Number = 0):void
{
this.radius = newradius;
this.theta = newtheta;
this.phi = newphi;
}
static public function get ZERO():SphericalCoord
{
return new SphericalCoord(0, 0, 0);
}
}
}
坐標轉換定義類CoordsTransform.cs
package hans_gis.coord
{
public class CoordsTransform
{
public function CoordsTransform()
{
}
public function CartesianToSpherical(coord:CartesianCoord):SphericalCoord{
var radius = this.GetModuloFromCartesianCoord(coord);
var theta = this.GetThetaFromCartesianCoord(coord);
var phi = this.GetPhiFromCartesianCoord(coord);
return new SphericalCoord(radius, theta, phi);
}
protected function GetModuloFromCartesianCoord(coord:CartesianCoord):Number
{
return Math.sqrt( coord.x*coord.x + coord.y*coord.y + coord.z*coord.z );
}
protected function GetThetaFromCartesianCoord(coord:CartesianCoord):Number{
// return Math.atan(Math.sqrt(coord.x*coord.x + coord.y*coord.y)/coord.z);
return Math.acos(coord.z/this.GetModuloFromCartesianCoord(coord));
}
protected function GetPhiFromCartesianCoord(coord:CartesianCoord):Number{
return Math.atan(coord.y/coord.x);
}
public function SphericalToCartesian(coord:SphericalCoord):CartesianCoord{
var x = this.GetXFromSphericalCoord(coord);
var y = this.GetYFromSphericalCoord(coord);
var z = this.GetZFromSphericalCoord(coord);
return new CartesianCoord(x, y, z);
}
protected function GetXFromSphericalCoord(coord:SphericalCoord):Number{
return coord.radius*Math.sin(coord.theta)*Math.cos(coord.phi);
}
protected function GetYFromSphericalCoord(coord:SphericalCoord):Number{
return coord.radius*Math.sin(coord.theta)*Math.sin(coord.phi);
}
protected function GetZFromSphericalCoord(coord:SphericalCoord):Number{
return coord.radius*Math.cos(coord.theta);
}
}
}
實例運行結果

附:實例下載
