Tôi có một tập hợp các điểm dữ liệu trong không gian 3D mà dường như tất cả đều rơi vào một mặt phẳng cụ thể. Tôi sử dụng PCA để tính toán các thông số mặt phẳng. Thành phần thứ 3 của PCA mang lại cho tôi vectơ bình thường của mặt phẳng (thành phần yếu nhất).Xoay vectơ bình thường trên mặt phẳng trục
Điều tôi muốn làm tiếp theo là chuyển tất cả các điểm trên mặt phẳng đã nói và xem nó theo dạng 2D.
Ý tưởng của tôi là phải làm như sau:
- Tìm một điểm trung tâm (điểm trung bình) trên máy bay
- trừ nó từ tất cả các điểm dữ liệu để sắp xếp chúng xung quanh nguồn gốc
- Xoay bình thường để nó trở thành (0,0, -1)
- Áp dụng luân chuyển này cho tất cả các điểm dữ liệu
- Sử dụng chiếu trực giao (về cơ bản, bỏ qua trục z)
Bây giờ tôi đang gặp khó khăn trong việc tìm kiếm hoạt động xoay đúng. Tôi đã thử làm việc với acos hoặc atan và thiết lập hai ma trận xoay. Có vẻ cả hai phương pháp (sử dụng acos, sử dụng atan) cho tôi kết quả sai. Có lẽ bạn có thể giúp tôi ở đây!
Matlab đang sau:
b = atan(n(1)/n(2));
rotb = [cos(b) -sin(b) 0; sin(b) cos(b) 0; 0 0 1];
n2 = n * rotb;
a = atan(n(1)/n(3));
rota = [cos(a) 0 sin(a); 0 1 0; -sin(a) 0 cos(a)];
n3 = n2 * rotaows:
Tôi hy vọng n2
có y thành phần của zero. Tuy nhiên điều đó đã thất bại đối với véc tơ (-0.6367, 0.7697, 0.0467).
Tại sao bạn không chỉ đơn giản là chiếu tất cả các điểm trên mặt phẳng và sau đó xoay mọi thứ để bạn có thể vẽ các điểm bằng tọa độ xz (hoặc xy) của chúng? –
Điều đó, hoặc gắn máy ảnh trực tiếp với mặt phẳng sao cho nó nhìn thẳng vào nó. –
Ý tưởng máy ảnh là một ý tưởng hay. Bạn di chuyển máy ảnh ra khỏi máy bay từ nguồn gốc một khoảng cách dọc theo bình thường. Sau đó, bạn chỉ máy ảnh vào nguồn gốc. Tất nhiên, điều này giả định rằng bạn có mã chiếu máy ảnh, có thể được thực hiện với các phép quay hoặc vectơ. – Nosredna