空间直角坐标系与球面坐标互转

空间直角坐标系与球面坐标互转

 1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 

 6 namespace AppSurveryTools.SphericalAndCartesian  7 {  8     class CartesianCoord  9  { 10         public double x; 11         public double y; 12         public double z; 13 

14         private static CartesianCoord temp = CartesianCoord.ZERO; 15 

16         public CartesianCoord(double x = 0, double y = 0, double z = 0) 17  { 18             this.x = x; 19             this.y = y; 20             this.z = z; 21  } 22 

23         public CartesianCoord clone() 24  { 25             return new CartesianCoord(this.x, this.y, this.z); 26  } 27 

28         public void copyTo(CartesianCoord n) 29  { 30             n.x = this.x; 31             n.y = this.y; 32             n.z = this.z; 33  } 34 

35         public void copyFrom(CartesianCoord n) 36  { 37             this.x = n.x; 38             this.y = n.y; 39             this.z = n.z; 40  } 41 

42         public void reset(double newx = 0, double newy = 0, double newz = 0) 43  { 44             this.x = newx; 45             this.y = newy; 46             this.z = newz; 47  } 48 

49         public static CartesianCoord ZERO 50  { 51             get

52  { 53                 return new CartesianCoord(0, 0, 0); 54  } 55  } 56  } 57 }
CartesianCoord
 1 namespace AppSurveryTools.SphericalAndCartesian  2 {  3     public class SphericalCoord  4  {  5         public double radius;  6         public double theta;  7         public double phi;  8 

 9         private static SphericalCoord temp = SphericalCoord.ZERO; 10 

11         public SphericalCoord(double radius, double theta = 0, double phi = 0) 12  { 13             this.radius = radius; 14             this.theta = theta; 15             this.phi = phi; 16  } 17 

18         public SphericalCoord clone() 19  { 20             return new SphericalCoord(this.radius, this.theta, this.phi); 21  } 22 

23         public void copyTo(SphericalCoord n) 24  { 25             n.radius = this.radius; 26             n.theta = this.theta; 27             n.phi = this.phi; 28  } 29 

30         public void copyFrom(SphericalCoord n) 31  { 32             this.radius = n.radius; 33             this.theta = n.theta; 34             this.phi = n.phi; 35  } 36 

37         public void reset(double newradius = 0, double newtheta = 0, double newphi = 0) 38  { 39             this.radius = newradius; 40             this.theta = newtheta; 41             this.phi = newphi; 42  } 43 

44         public static SphericalCoord ZERO 45  { 46             get

47  { 48                 return new SphericalCoord(0, 0, 0); 49  } 50  } 51  } 52 }
SphericalCoord
 1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 

 6 namespace AppSurveryTools.SphericalAndCartesian  7 {  8     class CoordsTransform  9  { 10         public CoordsTransform() 11  { 12  } 13 

14         public SphericalCoord CartesianToSpherical(CartesianCoord coord) 15  { 16             var radius = this.GetModuloFromCartesianCoord(coord); 17             var theta = this.GetThetaFromCartesianCoord(coord); 18             var phi = this.GetPhiFromCartesianCoord(coord); 19             return new SphericalCoord(radius, theta, phi); 20  } 21         /// <summary>

22         /// 获取空间直角坐标空间中模,径向距离 23         /// </summary>

24         /// <param name="coord"></param>

25         /// <returns></returns>

26         protected double GetModuloFromCartesianCoord(CartesianCoord coord) 27  { 28             return Math.Sqrt(coord.x * coord.x + coord.y * coord.y + coord.z * coord.z); 29  } 30         /// <summary>

31         /// 获取Theta角, 32         /// </summary>

33         /// <param name="coord"></param>

34         /// <returns></returns>

35         protected double GetThetaFromCartesianCoord(CartesianCoord coord) 36  { 37             //return Math.atan(Math.sqrt(coord.x*coord.x + coord.y*coord.y)/coord.z);

38             return Math.Acos(coord.z / this.GetModuloFromCartesianCoord(coord)); 39  } 40         /// <summary>

41         /// 天顶角 42         /// </summary>

43         /// <param name="coord"></param>

44         /// <returns></returns>

45         protected double GetPhiFromCartesianCoord(CartesianCoord coord) 46  { 47             return Math.Atan(coord.y / coord.x); 48  } 49 

50         public CartesianCoord SphericalToCartesian(SphericalCoord coord) 51  { 52             var x = this.GetXFromSphericalCoord(coord); 53             var y = this.GetYFromSphericalCoord(coord); 54             var z = this.GetZFromSphericalCoord(coord); 55             return new CartesianCoord(x, y, z); 56  } 57         //球面坐标计算X坐标

58         protected double GetXFromSphericalCoord(SphericalCoord coord) 59  { 60             return coord.radius * Math.Sin(coord.theta) * Math.Cos(coord.phi); 61  } 62         //球面坐标计算Y坐标

63         protected double GetYFromSphericalCoord(SphericalCoord coord) 64  { 65             return coord.radius * Math.Sin(coord.theta) * Math.Sin(coord.phi); 66  } 67         //球面坐标计算Z坐标

68         protected double GetZFromSphericalCoord(SphericalCoord coord) 69  { 70             return coord.radius * Math.Cos(coord.theta); 71  } 72  } 73 }
CoordsTransform

调用代码

 1   private void btnCartesianToSpherical_Click(object sender, EventArgs e)

 2         {

 3             CoordsTransform CoordTrans = new CoordsTransform();

 4             double x = (double)numX.Value;

 5             double y = (double)numY.Value;

 6             double z = (double)numZ.Value;

 7             CartesianCoord vCartesianCoord = new CartesianCoord(x, y, z);

 8             SphericalCoord ResSphericalCoord = CoordTrans.CartesianToSpherical(vCartesianCoord);

 9             numRadius.Value = (decimal)ResSphericalCoord.radius;

10             numPhi.Value = (decimal)ResSphericalCoord.phi;

11             numAmith.Value = (decimal)ResSphericalCoord.theta;

12         }

13 

14         private void btnSphericalToCartesian_Click(object sender, EventArgs e)

15         {

16             CoordsTransform CoordTrans = new CoordsTransform();

17             double radius = (double)numRadius.Value;

18             double phi = (double)numPhi.Value;

19             double theta = (double)numAmith.Value;

20             SphericalCoord vSphericalCoord = new SphericalCoord(radius, theta, phi);

21             CartesianCoord ResCartesianCoord = CoordTrans.SphericalToCartesian(vSphericalCoord);

22             numX.Value = (decimal)ResCartesianCoord.x;

23             numY.Value = (decimal)ResCartesianCoord.y;

24             numZ.Value = (decimal)ResCartesianCoord.z;

25         }
View Code

空间直角坐标系与球面坐标互转

参考文献:

http://www.cnblogs.com/hans_gis/archive/2012/11/21/2755126.html

你可能感兴趣的:(转)