Я бы вычислил главные оси инерции и взял бы вектор оси v
с наивысшим соответствующим моментом. Затем я бы повернул вершины, чтобы выровнять v
по оси z. Дайте мне знать, если вы хотите узнать больше о том, как это сделать.
Интуитивно, это находит ось, вокруг которой труднее всего вращать точки, то есть, вокруг которых вершины наиболее «разложены».
Без конкретного определения того, что вы считаете оптимальным, невозможно сказать, насколько хорошо работает этот метод. Тем не менее, он имеет несколько желательных свойств:
Если вершины копланарны, этот метод является оптимальным, поскольку он всегда выравнивает эту плоскость по плоскости x-y.
Если вершины расположены в прямоугольной рамке, кратчайший размер рамки выравнивается по оси Z.
РЕДАКТИРОВАТЬ: Вот более подробная информация о том, как реализовать этот подход.
Сначала назначьте массу каждой вершине. Я буду обсуждать варианты, как это сделать ниже.
Затем вычислите центр масс вашего набора вершин. Затем переведите все свои вершины в -1 раз в центр масс, чтобы новый центр масс стал теперь (0,0,0).
Вычислить момент тензора инерции. Это матрица 3х3, элементы которой задаются формулами, которые можно найти в Википедии. Формулы зависят только от позиций вершин и от назначенных вами масс.
Теперь вам нужно диагонализировать тензор инерции. Поскольку он является симметричным положительно определенным, это можно сделать, найдя его собственные векторы и собственные значения. К сожалению, численные алгоритмы для их нахождения, как правило, сложны; самый прямой подход требует нахождения корней кубического многочлена. Однако нахождение собственных значений и собственных векторов матрицы является чрезвычайно распространенной проблемой, и любой пакет линейной алгебры, достойный его соли, будет поставляться с кодом, который может сделать это за вас (например, пакет линейной алгебры с открытым исходным кодом Eigen имеет SelfAdjointEigenSolver.) также можно найти более легкий код, специализированный для случая 3x3, в Интернете.
Теперь у вас есть три собственных вектора и соответствующие им собственные значения. Эти собственные значения будут положительными. Возьмем собственный вектор, соответствующий наибольшему собственному значению; этот вектор указывает в направлении вашей новой оси Z.
Теперь по поводу выбора массы. Самое простое, что нужно сделать, это дать всем вершинам массу 1. Если у вас есть только облако точек, это, вероятно, хорошее решение.
Вы также можете установить массу каждой звезды равной ее массе в реальном мире, если у вас есть доступ к этим данным. Если вы сделаете это, вычисленная вами ось z также будет осью, вокруг которой (скорее всего) вращается звездная система.