Tôi đang lắp một mặt phẳng vào một điểm 3D được đặt bằng phương pháp ít nhất vuông. Tôi đã có thuật toán để làm điều đó, nhưng tôi muốn sửa đổi nó để sử dụng trọng số ít nhất vuông. Có nghĩa là tôi có một trọng lượng cho mỗi điểm (trọng lượng lớn hơn, máy bay càng gần đến điểm).Trọng lượng ít nhất vuông - vừa với mặt phẳng để đặt điểm 3D
Thuật toán hiện hành (không có trọng lượng) trông như thế này:
Tính tổng:
for(Point3D p3d : pointCloud) {
pos = p3d.getPosition();
fSumX += pos[0];
fSumY += pos[1];
fSumZ += pos[2];
fSumXX += pos[0]*pos[0];
fSumXY += pos[0]*pos[1];
fSumXZ += pos[0]*pos[2];
fSumYY += pos[1]*pos[1];
fSumYZ += pos[1]*pos[2];
}
hơn làm cho các ma trận:
double[][] A = {
{fSumXX, fSumXY, fSumX},
{fSumXY, fSumYY, fSumY},
{fSumX, fSumY, pointCloud.size()}
};
double[][] B = {
{fSumXZ},
{fSumYZ},
{fSumZ}
};
hơn giải quyết Ax = B và 3 các thành phần của giải pháp là các hệ số của đồng bằng được trang bị ...
S o, bạn có thể vui lòng giúp tôi làm thế nào để sửa đổi điều này để sử dụng trọng lượng? Cảm ơn!
FYI - nếu bạn có thể có nhiều điểm (> nói 20) và/hoặc tọa độ có chênh lệch lớn, không bao giờ tính toán thống kê theo cách bạn đang làm (bằng cách lấy tổng các bình phương của vị trí thô) - nó có độ nhạy kém với các lỗi số. Ở mức tối thiểu, bạn có thể trừ giá trị trung bình của tọa độ X/Y/Z trước, sau đó thực hiện quá trình xử lý của bạn, sau đó ở cuối, hãy thêm giá trị bù trừ. Có những cách giải thuật cụ thể khác để làm điều này, nhưng tôi không hiểu chính xác cách thuật toán của bạn sử dụng các ô vuông nhỏ nhất để không thể giúp nhiều hơn thế. –
Ý của bạn là gì? (xin lỗi, không hiểu nó trong ngữ cảnh này). –
Ví dụ nhanh: điểm p1 = (10001, 10002, 10003), p2 = (10005, 10006, 10007), p3 = (10009, 10004, 10008). Những giá trị này có giá trị trung bình (10005, 10004, 10006). Vì vậy, bạn bù đắp (dịch) các tọa độ điểm bởi đối diện của số tiền này để có được p1 '= (-4, -2, -3), p2' = (0,2,1), p3 '= (4,0, 2). Sau đó, làm toán học của bạn, sau đó thêm trở lại trong bù đắp. –