Версия 1.0 этой статьи описывала пересечение эллипса и прямой, проходящей через его центр. На практике, в 99% случаев, именно это и требуется. Однако, что ни говори, материал не полон. Поэтому рассмотрим пересечение эллипса и любой прямой.
Калькулятор
Вступление
Суть та же, что и раньше. Есть уравнение эллипса, есть уравнение прямой. Есть точка (x,y), которая является общей для обоих уравнений. Таким образом, есть система уравнений о двух переменных, которую надо решить.
Решение: выражение переменной Y из уравнения прямой, подстановка в уравнение эллипса, решение получившегося квадратного уравнения, нахождение X, подстановка в уравнение прямой, нахождение Y, занавес.
Теперь, по порядку. Нам понадобятся.
Уравнение эллипса:
Уравнение прямой:
Эллипс
Подготовим уравнение эллипса. В таком виде, как выше, оно не сильно облегчит работу, поэтому, путем несложных манипуляций, приведем его к виду:
Все переносим в левую часть и получаем:
Прямая
Выразим Y из уравнения прямой:
Уравнение прямой в своем стандартном варианте имеет вид:
Таким образом, имеем следующие коэффициенты:
Подстановка
Подставим Y в модифицированное уравнение эллипса:
Для упрощения вида уравнения и себе жизни введем пару констант:
Уравнение приобретает некую законченность и воздушность восприятия:
Путем таких же несложных преобразований приходим к следующему виду:
Ну вот понадобится кому-нибудь в комментариях, распишу…
Квадратное уравнение
Дабы поскорее избавится от этого кошмарного забора, давайте увидим, что это обычное квадратное уравнение, у которого следующие коэффициенты:
Остается только его решить. Находим дискриминант D (держу B заглавной, чтобы не путать с b из уравнения прямой):
Напомню:
- Если D < 0, корней нет;
- Если D = 0, один корень;
- Если D > 0, два корня.
Находим X:
Подставляем найденные значения X в уравнение прямой, находим Y.
Все, занавес.
Итоги
Да как бы ни так.
Во-первых, хотелось бы резюмировать. Для нахождения точек пересечения любой прямой с эллипсом необходимо решить квадратное уравнение обычным дедовским способом, коэффициенты которого находятся так.
Используемые «сокращения»:
Где: Rx — радиус a, Ry — радиус b, (x0,y0) — координаты центра эллипса, (x1,y1) — точка A, (x2,y2) — точка B.
Во-вторых. Есть неприятность, связанная с (x2 — x1). Если линия строго вертикальна, получаем деление на ноль.
Крайние точки
Собственно, можно попробовать сравнивать это значение, скажем, с 0.0001 и в случае, если меньше, работать с этим значением. Но при таком малом делителе все последующие квадраты просто ахнут. Это в классической алгебре с ее абстракциями можно работать с приличной аналитической точностью. Мы живем в компьютерном мире, тут нет ничего точного. Одни погрешности… )))
При строго (или почти) вертикальной линии значение X нам известно. Осталось найти Y. Снова берем уравнение эллипса
И путем совсем простых действий превращаем его:
Замечаем, что в правой части у нас константа, потому что X известен.
Уравнение приобретает совсем человеческие очертания:
Решаем квадратное уравнение при коэффициентах:
Решаем старым дедовским способом, помня, что на этот раз находим пару координат Y.
При вычислениях надо анализировать величину (x2 — x1), и если она близка к нулю, использовать только что описанный способ, во всех остальных случаях работает основное уравнение.
Вот теперь, все, занавес.
Друзья, спасибо за внимание!
Пишите, спрашивайте, что знаю, отвечу.
Что не знаю, узнаю )
Подписывайтесь на телегу.
Всем классного лета!
Доброго дня! Искал статью, и наткнулся, прям судьба 🙂 У меня есть один вопрос. Я изучил статью и реализовал у себя это у себя в примере. Единственное, у меня у эллипса центр смещен, но в Вашей статье это учитывается. Так вот, моя проблема в том, что при эллипсе, который является окружностью, все работает идеально. Но как только a != b — начинаются проблемы. Перечитал множество раз, рассчитывал на бумаге — но упорно найти не могу. Не могли бы взглянуть на код, может быть ошибка на виду? Спасибо.
P.S.: rect — x,y,w,h прямоугольника, в который вписан эллипс, p1 и p2 — две точки прямой. Все эти величины целочисленные, уже потом начинает добавляться плавающая запятая. Код (тут java, но он максимально понятен, так как математика одинаковая везде):
Здравствуйте! Прошу прощения за оперативность. Лето это ж маленькая жизнь )))
Думаю коэффициенты должны стать такими:
A = (_b * _b) + (_a * _a) * (k * k);
C = (_b * _b) * (x0 * x0) + (_a * _a) * (s * s) — v;
Собственно поэтому на круге и работало, перепутаны полуоси Rx и Ry
Если это не поможет буду смотреть прям очень внимательно, но больше ошибок не нашел
Добрый день! Подскажите пожалуйста, а как будет выглядеть квадратное уравнение, если вместо уравнения прямой в отрезках будет использоваться уравнение прямой в общем виде?
Здравствуйте, Алексей!
Уравнение прямой в общем виде:
A*X + B*Y + C = 0
Следовательно:
k = -A/B, b = -C/B
Для строго вертикального случая используется координата х, которая постоянна, и находится как:
x = -C/A
В самом квадратном уравнении используются k и b (или константа x), поэтому его вид не изменится никак.