Как получить каноническое уравнение эллипса по N его точкам?
В результате ряда операций с окружностью с известными координатами, а именно: вращение ее "оси" под углами a, b вокруг осей Z, Y соответственно, и последующим ее проецированием на плоскость OXZ под углами c, d, был получен эллипс.
Известны: координаты центра эллипса,
его смещение относительно нулевой точки системы координат,
кооридинаты необходимого числа точек для вывода уравнения эллипса (проставляются на окружности до начала всех преобразований).
Неизвестны:
длины полуосей;
угол поворота полуосей;
Необходимо:
иметь возможность проверять принадлежность произвольной точки эллипсу, что требует вывода уравнения;
рассчитать площадь эллипса.
Расчетный алгоритм реализуется на JAVA, проверка правильности вычислений через чертежное ПО Kompas.
Изучил интернет на предмет возможных решений, однако или я слишком плохо разбираюсь или по делу почти ничего нет.
Варианта вижу два: для проверки принадлежности точки эллипсу, выполнить обратные преобразования проверяемой точки и проверить ее принадлежность окружности, но это не позволит вычислить площадь эллипса.
Второй вариант: представление эллипса как кривой второго порядка и решение матрицы с 5 неизвестными, однако не очень силен в программировании, как и в математике, чтобы задать алгоритм. Взял библиотеку JAMA, но так как там нельзя задать условия для искомых величин при решении матрицы, она просто все члены уравнения кривой второго порядка делает нулями, что и является решением матрицы.
Прошу подсказать наиболее короткий путь решения задачи или, если имеется, таковой, поделиться кодом.
На спроецированном эллипсе синие пересекающиеся прямые являются его осями, построенные благодаря функционалу Компаса. В общем-то задача сводится к тому, чтобы понять, как он определяет полуоси, зная центр эллипса и 3 любых принадлежащих ему точки
точки на окружности после преобразований оказываются где угодно? Надо бы получить координаты точек большого и малого диаметров – это невозможно по условиям задачи?
Окружность до начала преобразований была поделена 2 диаметрами CD (вертикальный) и EF (горизонтальный). По-началу, я думал, что они и будут в проекции полуосями, однако, после включения в расчеты дополнительных точек на окружности и их построении на чертеже, я понял, что ранее неправильно полагал.
В результате всех этих поворотов и проецирования под углами, эти отрезкки просто пересекают центр эллипса, а точки C, D, E, F лежат на краю.
Сергей Соколов, да
был выполнен поворот в трехмерной системе координат вокруг оси Z (см. иллюстрацию), затем поворот на другой угол вокруг оси Y.
Затем выполнен перевод в иную систему координат, затем была выполнена проекция точек, заранее обозначенных на окружности на плоскость XC под определенным углом наклона и углом направления
xmoonlight, потому что проекцией под любым углом круга расположенного под любым иным углом является эллипс.
Ну и чисто практически я проверял путем подстановки множества точек на окружность с последующей проекцией. Все они попадали на границу эллипса.
1. Для проверки попадания точки внутрь эллипса - ваше предложение наиболее разумное. Благо все преобразования аффинные и для них обратные строятся просто. Находите прообраз интересующей точки в плоскости окружности и легко проверяете попадание.
2. При аффинных преобразованиях перпендикулярные диаметры окружности перейдут в сопряжённые диаметры эллипса. Зная векторы сопряжённых диаметров c1, c2, легко вычислить площадь эллипса π Abs(VectorProduct(c1,c2)).
Если нужны какие-то ещё параметры эллипса, то их можно вычислить из свойств сопряжённых диаметров (в английской литературе conjugate diameters).
Главные диаметры часто строят с помощью Rytz's consturction.
Да, кстати, может подскажите заодно вот какой момент. При проверке принадлежности точки "кругу" при обратном преобразовании, имеется ли необходимость в обратном проецировании? Или же просто сразу поворачиваю ее вокруг осей Z и Y нормальной системы координат и просто, игнорируя координаты X, проверяю принадлежность окружности?
Не "обратное проецирование", а преобразование обратное к проецированию. Надо в обратном порядке всё применить - преобразование обратное к проецированию, поворот вокруг оси Y, поворот вокруг Z. Если в какой-то момент вам легко будет определить координаты в плоскости круга (именно 2-мерные, а не (x,y,z) в лабораторной системе), то на этом шаге можно сразу проверить принадлежность.
Taus, проблема тогда в том, что неизвестно, как выполнять первый этап. То есть на какую "высоту" выполнять преобразование обратное проецированию. Ведь все точки круга проецировались на разное расстояние.
Вместе с тем, полагаю, что выполнив обратное вращение всех объектов (круга, являющегося основанием конуса, а также проверяемой точки) сразу, без проекционного преобразования точки, можно достоверно определить, принадлежит она кругу или нет. Это предположение не верно?
Надо получить уравнение плоскости, в которой лежит окружность. Пусть в эта плоскость задана каноническом виде Ax+By+Cz+D=0. Тогда прообраз точки (x0, z0) с плоскости OXZ на этой плоскости находится из этого же уравнения: y0 = -(D+Ax0+Cz0)/B, а координаты (x0, y0, z0).
Смешивать преобразования, как вы предлагаете не надо, потому что их не всегда можно переставлять.
Taus, и все-таки, я сейчас еще раз хорошенько обдумал, нет, нужно именно уравнение эллипса получать. Дело в том, что из точки A' идут 2 касательных к эллипсу, ограничивая также пространство, "накрываемое" фигурой. Если я не получу уравнение эллипса, то не смогу построить эти 2 касательных. Пожалуй, то, что вы говорили о сопряженных диаметрах - верная мысль.
Почему вы не рекомендуете использовать уравнение кривой второго порядка? По изложенной мной же причине: сложность автоматизированного расчета? Или есть иные причины?
Taus, мне очень нравится, как компас строит эллипс в точности как надо по центру и трем точкам кроме него. Полагаю, это происходит по какому-то общеизвестному алгоритму, но поиски ни к чему не привели. Есть ли у вас соображения на этот счет?
С помощью сопряжённых диаметров всё можно построить. https://en.wikipedia.org/wiki/Ellipse - на википедии неплохая статья.
Общее уравнение кривой второго порядка (конику) - оверкилл здесь. Его стоит применять, когда вам надо по 5 точкам построить конику. А так как вы знаете, что эллипс получился после таких преобразований, то можно существенно упростить себе жизнь.
Про алгоритм построения главных диаметров добавил в основной ответ - это построение Ритца.
Taus, вы дали мне материалы для усвоения на выходные, спасибо большое. Можно ли как-то с вами связаться при необходимости, посредством персональных средств связи на возмездной основе?
Taus, К сожалению, телеграмма нет, очень заинтересовал метод Ритца. Кажется, это решение моего вопроса, надо еще подразобраться немного. Поражает, что в русскоязычном сегменте вообще ничего об этом не говорится.
Я правильно понимаю, что если E'F' в моем случае спроецирован параллельно и без искажений относительно EF, то я могу использовать этот случай, даже если C'D' удлинился (сжался) и изменил угол относительно CD?
Если у вас параллельная проекция так устроена, то почему бы и нет. E'F' будет равно EF, если EF параллельна прямой пересечения плоскостей EFE'F'(плоскость параллельного проектирования отрезка EF) и OXZ.
Taus, огромное Вам спасибо! Сработало!
Обязуюсь описать этот метод для русскоязычной аудитории с примером практического применения в машиностроении, но не в самой ближайшей перспективе, к сожалению.
Решением проблемы оказался чертежный подход Ритца, к которому я подготовил математическое описание для своей ситуации и запрограммировал расчет. https://es.wikiqube.net/wiki/Rytz%27s_construction
На мой взгляд, это лучшее решение.
x = a * cos(t)
y = b * sin(t)
0 ≤ t ≤ 2π
где a, b − полуоси эллипса, t − параметр.
позволяет убрать из уравнения тригонометрию от t: (sin^2 + cos^2) = 1
и выразить a как функцию b при известных (x, y).
x2 = a2 * cos2(t)
y2 = b2 * sin2(t)
и изолировать sin,cos:
x2 / a2 = cos2(t)
y2 / b2 = sin2(t)
осталось сложить и вывести a = f(b)
x2 / a2 + y2 / b2 = 1
Upd. не учёл третье неизвестное: угол поворота осей.
В повернутой коорд. системе:
x' = x cos ß + y sin ß
y' = -x sin ß + y cos ß
Заменить этими выражениями простые x2 и y2
И как-то решить систему уравнений, подставив известные x, y точек.
xmoonlight,
Ну для наглядности, да и к тому же он умеет строить эллипс по 4 точкам: центр + 3 на эллипсе. Хороший способ проверить результаты вычислений
По поводу UPD. Я составил такую систему уравнений с 3 неизвестными, она получилась довольно громоздкой для обычного решения.
И необходимо было прибегать к матричному, которое для меня трудно поддаются автоматизации. Когда я его привел к матричному виду, получил ту же ситуацию и даже чуть хуже, что и с кривой второго порядка: библиотека JAMA находила решение путем приведения всего что можно к 0, но в отличие от того уравнения, тут еще и были сгруппированы множители типа a^2b^2 в одно искомое неизвестное.
Я обновил пост иллюстрацией, возможно она прольет свет немного
xmoonlight, Для наглядности добавил изображение в вопрос.
Дело в том, что круг подвергался массе преобразованний перед тем, как была получена проекция, более того, проекция выполняется не под прямым углом к какой-либо из плоскостей системы координат. Здесь, скорее всего, проще работать непосредственно с самим эллипсом
xmoonlight,
1 указано в посте сразу:
В результате ряда операций с окружностью с известными координатами, а именно: вращение ее "оси" под углами a, b вокруг осей Z, Y соответственно, и последующим ее проецированием на плоскость OXZ под углами c, d, был получен эллипс.
2. я не знал, насколько это важно, изложил, что знал
3. Мы проецируем окружность, изображенная на рисунке вторая составляющая проекции легко строится путем проведения касательных к эллипсу из точки A'
1. Есть две плоскости в единой системе координат (плоскость круга и плоскость, куда мы его будем проецировать).
2. Производим расчёт проекции любой произвольной точки, принадлежащей одной плоскости, на другую плоскость (3D): здесь.
3. Принадлежность точки кругу или эллипсу - проверяем точно также (п.2), используя нужную плоскость для проецирования точки на другую плоскость.
(Для окружности/круга: только частный случай - если речь не идёт об использовании перспективы/рассеивания! Например, не подойдёт, если необходима проекция луча прожектора с использованием перспективы)
PS: Приведение кривой второго порядка к каноническому виду (2D): тут.
Нужно подставить координаты 5-ти точек (уже спроецированных на плоскость) в каждое уравнение 2-го порядка и решить систему из 6-ти уравнений (5 и 1 канонический вид для эллипса) и 2-х неравенств (для коэффициентов эллипса) для поиска всех коэффициентов уравнения 2-го порядка для эллипса и при необходимости, привести его к каноническому виду.