Пересечение эллипса и прямой

Версия 1.0 этой статьи описывала пересечение эллипса и прямой, проходящей через его центр. На практике, в 99% случаев, именно это и требуется. Однако, что ни говори, материал не полон. Поэтому рассмотрим пересечение эллипса и любой прямой.

Калькулятор

Введите параметры эллипса и линии.
0
Если есть вопросы или предложения по калькулятору, буду рад их услышатьx
Сняв галочку с «Центр эллипса», точка «А» перейдет в свободное состояние, ее также можно перетаскивать, и появляется возможность перетаскивать весь отрезок.

Get a better browser, bro…

Вступление

Суть та же, что и раньше. Есть уравнение эллипса, есть уравнение прямой. Есть точка (x,y), которая является общей для обоих уравнений. Таким образом, есть система уравнений о двух переменных, которую надо решить.

Решение: выражение переменной Y из уравнения прямой, подстановка в уравнение эллипса, решение получившегося квадратного уравнения, нахождение X, подстановка в уравнение прямой, нахождение Y, занавес.

Теперь, по порядку. Нам понадобятся.

Уравнение эллипса:

Latex formula

Уравнение прямой:

Latex formula

Эллипс

Подготовим уравнение эллипса. В таком виде, как выше, оно не сильно облегчит работу, поэтому, путем несложных манипуляций, приведем его к виду:

Несложные манипуляции с уравнением эллипса

Latex formula

Latex formula

Latex formula

Все переносим в левую часть и получаем:

[свернуть]
Latex formula

Прямая

Выразим Y из уравнения прямой:

Latex formula

Уравнение прямой в своем стандартном варианте имеет вид:

Latex formula

Таким образом, имеем следующие коэффициенты:

Latex formula

Latex formula

Подстановка

Подставим Y в модифицированное уравнение эллипса:

Latex formula

Для упрощения вида уравнения и себе жизни введем пару констант:

Latex formula

Latex formula

Уравнение приобретает некую законченность и воздушность восприятия:

Latex formula

Путем таких же несложных преобразований приходим к следующему виду:

Несложные преобразования уравнения эллипса

Ну вот понадобится кому-нибудь в комментариях, распишу…

[свернуть]
Latex formula

Квадратное уравнение

Дабы поскорее избавится от этого кошмарного забора, давайте увидим, что это обычное квадратное уравнение, у которого следующие коэффициенты:

Latex formula

Latex formula

Latex formula

Остается только его решить. Находим дискриминант D (держу B заглавной, чтобы не путать с b из уравнения прямой):

Latex formula

Напомню:

  • Если D < 0, корней нет;
  • Если D = 0, один корень;
  • Если D > 0, два корня.

Находим X:

Latex formula

Подставляем найденные значения X в уравнение прямой, находим Y.

Все, занавес.

Итоги

Да как бы ни так.

Во-первых, хотелось бы резюмировать. Для нахождения точек пересечения любой прямой с эллипсом необходимо решить квадратное уравнение обычным дедовским способом, коэффициенты которого находятся так.

Используемые «сокращения»:

Latex formula

Latex formula

Latex formula

Latex formula

Где: Rx — радиус a, Ry — радиус b, (x0,y0) — координаты центра эллипса, (x1,y1) — точка A, (x2,y2) — точка B.

Во-вторых. Есть неприятность, связанная с (x2 — x1). Если линия строго вертикальна, получаем деление на ноль.

Крайние точки

Собственно, можно попробовать сравнивать это значение, скажем, с 0.0001 и в случае, если меньше, работать с этим значением. Но при таком малом делителе все последующие квадраты просто ахнут. Это в классической алгебре с ее абстракциями можно работать с приличной аналитической точностью. Мы живем в компьютерном мире, тут нет ничего точного. Одни погрешности… )))

При строго (или почти) вертикальной линии значение X нам известно. Осталось найти Y. Снова берем уравнение эллипса

Latex formula

И путем совсем простых действий превращаем его:

Latex formula

Latex formula

Замечаем, что в правой части у нас константа, потому что X известен.

Latex formula

Уравнение приобретает совсем человеческие очертания:

Latex formula

Решаем квадратное уравнение при коэффициентах:

Latex formula

Latex formula

Latex formula

Решаем старым дедовским способом, помня, что на этот раз находим пару координат Y.

При вычислениях надо анализировать величину (x2 — x1), и если она близка к нулю, использовать только что описанный способ, во всех остальных случаях работает основное уравнение.

Вот теперь, все, занавес.


Друзья, спасибо за внимание!

Пишите, спрашивайте, что знаю, отвечу.

Что не знаю, узнаю )

Подписывайтесь на телегу.

Всем классного лета!


5 6 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
2 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Иван
Иван
2 месяцев назад

Доброго дня! Искал статью, и наткнулся, прям судьба 🙂 У меня есть один вопрос. Я изучил статью и реализовал у себя это у себя в примере. Единственное, у меня у эллипса центр смещен, но в Вашей статье это учитывается. Так вот, моя проблема в том, что при эллипсе, который является окружностью, все работает идеально. Но как только a != b — начинаются проблемы. Перечитал множество раз, рассчитывал на бумаге — но упорно найти не могу. Не могли бы взглянуть на код, может быть ошибка на виду? Спасибо.
P.S.: rect — x,y,w,h прямоугольника, в который вписан эллипс, p1 и p2 — две точки прямой. Все эти величины целочисленные, уже потом начинает добавляться плавающая запятая. Код (тут java, но он максимально понятен, так как математика одинаковая везде):

2
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x