如何在3D空间中的笛卡尔坐标系和极坐标系之间进行转换?最好用c#例子,但真的很值得欣赏。谢谢!
修改 当考虑20%的变化(不形成球体)时
修改2
private void Spherise() {
for (int i = 0; i < vertices.Count; i++) {
float radius = this.radius;
float longitude = 0;
float latitude = 0;
float sphereRadius = 32;
Color color = vertices[i].Color;
ToPolar(vertices[i].Position - centre, out radius, out longitude, out latitude);
Vector3 position = ToCartesian(sphereRadius, longitude, latitude) + centre;
Vector3 normal = vertices[i].Position - centre;
normal.Normalize();
const float lerpAmount = 0.6f;
Vector3 lerp = (position - vertices[i].Position) * lerpAmount + vertices[i].Position;
vertices[i] = new VertexPositionColorNormal(lerp, color, normal);
}
}
private void ToPolar(Vector3 cart, out float radius, out float longitude, out float latitude) {
radius = (float)Math.Sqrt((double)(cart.X * cart.X + cart.Y * cart.Y + cart.Z * cart.Z));
longitude = (float)Math.Acos(cart.X / Math.Sqrt(cart.X * cart.X + cart.Y * cart.Y)) * (cart.Y < 0 ? -1 : 1);
latitude = (float)Math.Acos(cart.Z / radius) * (cart.Z < 0 ? -1 : 1);
}
private Vector3 ToCartesian(float radius, float longitude, float latitude) {
float x = radius * (float)(Math.Sin(latitude) * Math.Cos(longitude));
float y = radius * (float)(Math.Sin(latitude) * Math.Sin(longitude));
float z = radius * (float)Math.Cos(latitude);
return new Vector3(x, y, z);
}
答案 0 :(得分:5)
从笛卡儿到极地:
r = sqrt(x * x + y * y + z * z)
long = acos(x / sqrt(x * x + y * y)) * (y < 0 ? -1 : 1)
lat = acos(z / r)
从极地到笛卡儿:
x = r * sin(lat) * cos(long)
y = r * sin(lat) * sin(long)
z = r * cos(lat)
我还没有测试过。
您可以重写以减少浮点运算次数。
答案 1 :(得分:0)
取决于如何测量方位角 - 从水平面或垂直轴。我已经阅读了维基百科的文章,但是如果你把它作为地理纬度来衡量(赤道= 0,波兰= + 90和-90)那么你应该使用 asin 和 sin 强>
我在3D建模软件中使用c#,并且相对于xy平面而不是z轴测量方位角。在我的例子中,公式是:
lat = asin (z / r)
x = r * cos (lat)* cos(长)
y = r * cos (lat)* sin(长)
z = r * 罪(纬度)