Прежде всего, если в вашем уравнении плоскости, d = 0, нет линейного преобразования , которое вы можете применить. Вместо этого вам нужно выполнить аффинное преобразование .
Один из способов сделать это - определить угол и вектор, вокруг которого вращаться, чтобы ваша точка лежала в плоскости, параллельной плоскости XY (т. Е. Компонент Z вашего преобразованного набора точек для всех имеет одинаковые значения). Затем вы просто отбрасываете компонент Z.
Для этого пусть V будет нормализованной плоскостью, нормальной для плоскости, содержащей ваши точки. Для удобства определите из вашей плоскости уравнение выше Ax + By + Cz + d = 0:
<B>V</b> = (A, B, C)
<B>V'</b> = <B>V</b> / ||<B>V</b>|| = (A', B', C')
<B>Z</b> = (0, 0, 1)
, где
A' = A / ||<B>V</B>||
B' = B / ||<B>V</B>||
C' = C / ||<B>V</B>||
||<B>V</B>|| = (A<sup>2</sup>+B<sup>2</sup>+C<sup>2</sup>)<sup>1/2</sup>
Угол будет просто:
θ = cos<sup>-1</sup>(<B>Z</B>∙<B>V</B> / ||<B>V</B>||)
= cos<sup>-1</sup>(<B>Z</B>∙<B>V'</B>)
= cos<sup>-1</sup>(C')
Ось R , вокруг которой вращается, является просто перекрестным произведением нормализованной плоскости, нормальной V ' и Z . Это
<b>R</b> = <b>V'</b>×<b>Z</b>
= (B', -A', 0)
Теперь вы можете использовать эту пару угол / ось, чтобы построить кватернионное вращение , необходимое для поворота всех точек в вашем наборе данных в плоскость, параллельную плоскости XY. Затем, как я сказал ранее, просто опустите компонент Z, чтобы выполнить ортогональную проекцию на плоскость XY.
Обновление: antonakos дает хороший совет о нормализации R перед использованием API с учетом пар ось / угол.