Saya mencoba mencari matriks transformasi, yang akan memungkinkan saya untuk mentransfer pesawat yang diberikan ke pesawat XY. Berdasarkan ini jawab, saya telah menyiapkan fungsi python kecil yang melakukan perhitungan ini. Namun saya tidak mengerti mengapa bidang terakhir tidak dalam XY. Bisakah Anda membantu saya dan memberi tahu saya apa yang saya lakukan salah?

Pesawat input saya (tampilan 3d):

390.17 * x + -571.67 * y + -4008.29 * z + 2833797.03 = 0
input = [390.17, -571.67, -4008.29, 2833797.03]
z = 0.0973*x - 0.1427*y + 706.9838 

Sepertinya saya untuk memindahkannya ke pesawat XY, rotasi tentang sumbu X dan Y harus dilakukan (pertama). Elemen terakhir adalah terjemahan di sepanjang sumbu Z.

Berdasarkan ini, href="https://matckexchange.com/a/2950702"> jawab Saya telah menyiapkan fungsi saya transform_plane () . (kode di bawah).

Akibatnya fungsi mengembalikan pesawat baru: (tampilan 3d)

2.19436115e+00  1.61044899e+03  4.06772244e+03 -4.20201320e+04 = 0
out = [2.19436115e+00, 1.61044899e+03, 4.06772244e+03, -4.20201320e+04]
Z = -0.0005*x-0.3959*y+10.3301

Sepertinya, pesawat itu hanya diputar tentang Y, dan untuk menyelaraskannya dengan XY, itu juga harus diputar tentang sumbu x. Apakah itu berarti saya lupa tentang sesuatu? atau matriks yang disajikan dalam jawaban yang ditautkan tidak cukup untuk mendapatkan transformasi untuk dua sumbu yang berbeda?

Edit: Berkat jawaban di bawah ini saya dapat menemukan akar kuadrat yang hilang, namun saya tidak mengerti mengapa terjemahan saya tidak cukup. Alih-alih Z = 0, hasil saya adalah Z = 10. Tampaknya bagi saya yang mungkin -d/c juga harus dibagi dengan akar kuadrat.

Implementasi saya:

import numpy as np

def calc_cos_phi(a, b, c):
    return c / sqrt(a*a + b*b + c*c)


def calc_sin_phi(a, b, c):
    return sqrt((a*a + b*b) / (a*a + b*b + c*c))


def calc_u1(a, b, c):
    return b / (a*a + b*b)


def calc_u2(a, b, c):
    return -a / sqrt(a*a + b*b)


def get_transform_matrix(plane):
    a, b, c, d = plane
    cos_phi = calc_cos_phi(a, b, c)
    sin_phi = calc_sin_phi(a, b, c)
    u1 = calc_u1(a, b, c)
    u2 = calc_u2(a, b, c)
    out = np.array([
        [cos_phi + u1 * u1 * (1 - cos_phi)  , u1 * u2 * (1 - cos_phi)           , u2 * sin_phi  ,  0            ],
        [u1 * u2 * (1 - cos_phi)            , cos_phi + u2 * u2 * (1 - cos_phi) , -u1 * sin_phi ,  0            ],
        [-u2 * sin_phi                      , u1 * sin_phi                      ,      cos_phi  , -d / c        ],
        [0                                  , 0                                 , 0             ,  1            ]
    ])
    return out


def transform_plane(plane):
    t = get_transform_matrix(plane)
    t_inv = np.linalg.inv(t)
    new_plane = np.dot(plane, t_inv)
    print("new plane:")
    print(new_plane)
    return new_plane

Uji:

plane = [390.17, -571.67, -4008.29, 2833797.03]
plane_xy = transform_plane(plane)
0
flamingo 4 April 2021, 23:28

1 menjawab

Jawaban Terbaik

Anda telah melewatkan sqrt di sini:

def calc_u1(a, b, c):
   return b / (a*a + b*b)

Seharusnya

def calc_u1(a, b, c):
   return b / sqrt(a*a + b*b)

Penggantian memberikan [-1.13686838e-13 0.00000000e+00 4.06760715e+03 -4.19362793e+04] - x Koefisien hampir nol, bidang paralel dengan oxy (seperti z=-1.05)

1
MBo 5 April 2021, 03:25