Как повернуть набор точек в 3D - PullRequest
0 голосов
/ 22 января 2020

У меня есть набор трехмерных координат, и мне нужно повернуть их так, чтобы две специальные точки среди этих точек находились в одном и том же y и в одном и том же z.

    points = [[212.0, 383.0, -228.6603240966797], [232.0, 429.0, -215.2471160888672],
 [251.0, 474.0, -200.294677734375], [264.0, 506.0, -182.71034240722656],
 [271.0, 545.0, -151.659912109375], [271.0, 571.0, -103.2275390625],
 [264.0, 584.0, -49.09677505493164], [264.0, 590.0, 7.094006061553955],
 [297.0, 577.0, 55.64094543457031], [342.0, 545.0, 71.67172241210938],
 [387.0, 506.0, 62.63969421386719], [426.0, 474.0, 44.307640075683594],
 [458.0, 429.0, 26.28571319580078], [465.0, 383.0, 12.79250431060791],
 [465.0, 345.0, 6.777912616729736], [458.0, 299.0, 1.9844478368759155],
 [452.0, 247.0, -5.032294750213623], [115.0, 351.0, -101.5836410522461],
 [103.0, 332.0, -72.67787170410156], [109.0, 319.0, -43.654144287109375],
 [122.0, 312.0, -19.765241622924805], [135.0, 306.0, -1.681771159172058],
 [193.0, 267.0, 55.84020233154297], [212.0, 247.0, 65.46025848388672],
 [232.0, 235.0, 72.62020111083984], [271.0, 222.0, 77.47245025634766],
 [309.0, 222.0, 74.32344818115234], [180.0, 338.0, 39.40024185180664],
 [174.0, 364.0, 57.072181701660156], [174.0, 390.0, 76.49188232421875],
 [174.0, 416.0, 82.25331115722656], [193.0, 442.0, 37.21649169921875],
 [200.0, 442.0, 50.35261535644531], [206.0, 435.0, 63.788761138916016],
 [225.0, 429.0, 70.10556030273438], [238.0, 422.0, 72.33536529541016],
 [141.0, 370.0, -60.250762939453125], [135.0, 357.0, -38.055809020996094],
 [148.0, 351.0, -22.5621395111084], [174.0, 351.0, -12.084064483642578],
 [161.0, 364.0, -19.454940795898438], [141.0, 370.0, -37.95323181152344],
 [238.0, 306.0, 47.747005462646484], [245.0, 286.0, 62.69716262817383],
 [258.0, 273.0, 75.76963806152344], [290.0, 273.0, 73.55001068115234],
 [271.0, 293.0, 74.48524475097656], [251.0, 306.0, 63.64972686767578],
 [206.0, 506.0, 13.387508392333984], [200.0, 487.0, 39.5601806640625],
 [206.0, 474.0, 61.46839904785156], [219.0, 467.0, 71.84937286376953],
 [225.0, 461.0, 78.72380828857422], [264.0, 461.0, 86.57514953613281],
 [303.0, 461.0, 83.29869842529297], [271.0, 480.0, 85.00387573242188],
 [251.0, 500.0, 81.7071304321289], [238.0, 513.0, 71.04291534423828],
 [225.0, 519.0, 57.28331756591797], [212.0, 513.0, 39.4271125793457],
 [212.0, 506.0, 16.236431121826172], [219.0, 487.0, 56.382171630859375],
 [232.0, 480.0, 69.22164916992188], [245.0, 474.0, 77.29556274414062],
 [297.0, 461.0, 79.41549682617188], [245.0, 480.0, 75.18701171875],
 [232.0, 487.0, 65.57536315917969], [219.0, 493.0, 53.41996765136719]]

две точки, которые мне нужно сбалансировать, являются индексными 0 и индекс 16. Как я могу повернуть все координаты, чтобы эти две точки находились в одной плоскости z и плоскости y? обратите внимание, что x и y всегда положительны, где z может быть и тем, и другим.

Я упоминал этот вопрос в своих попытках и не могу понять

как я могу go об этом?

1 Ответ

0 голосов
/ 22 января 2020

Пусть P[0] является базовой точкой, и мы хотим повернуть другие точки вокруг нее.
Сначала вычтите P[0] координаты из всех.
Теперь у нас есть новые P[16]' координаты xx, yy, zz.
Поворот точек вокруг оси Z на угол phi=-atan2(yy,zz).
Поворот точек вокруг оси Y на угол theta = -acos(zz/L), где L=P[16]'.length.
Смещение координат назад на начальные P[0] (если нам нужно получить базовую точку ).

Таким образом, получающаяся матрица аффинного преобразования является произведением

 M = Shift(-P[0]) * Rot(phi) * Rot(Theta) * Shift(P[0])
...