5

3D 空間でデカルト座標系と極座標系 (および逆) 座標系をどのように変換しますか? できれば ac# の例を使用しますが、本当に感謝しています。ありがとう!

編集 変化の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);
    }

ここに画像の説明を入力

4

3 に答える 3

7

デカルトから極へ:

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)

まだテストしていません。

浮動小数点演算の数を減らすために書き直すことができます。

于 2012-06-03T05:55:27.600 に答える
2

これは、方位角の測定方法 (水平面からか、垂直軸からか) によって異なります。ウィキペディアの記事を読みましたが、地理的な緯度 (赤道 = 0、極 = +90 および -90) として測定する場合は、asinおよびsinを使用する必要があります。

私は 3D モデリング ソフトウェアで c# を使用していますが、方位角は z 軸ではなく xy 平面に対して測定されます。私の場合、式は次のとおりです。

緯度 =アシン(z / r)

x = r * cos (lat) * cos(long)

y = r * cos (緯度) * sin(経度)

z = r * sin (緯度)

于 2018-02-19T14:03:06.117 に答える