gpt4 book ai didi

c# - 笛卡尔坐标到极坐标(3d 坐标)

转载 作者:行者123 更新时间:2023-12-02 14:13:52 26 4
gpt4 key购买 nike

如何在 3D 空间中的笛卡尔坐标系和极坐标系(以及反坐标系)之间进行转换?最好有一个 C# 示例,但任何内容都将不胜感激。谢谢!

编辑当考虑20%的变化时(不形成球体)

enter image description here

编辑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);
}

enter image description here

最佳答案

从笛卡尔坐标到极坐标:

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)

我还没有测试过。

您可以重写以减少浮点运算的数量。

关于c# - 笛卡尔坐标到极坐标(3d 坐标),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10868135/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com