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

Точнее будет «Пересечение эллипса и прямой, проходящей через его центр». Слишком длинное название не хотелось выводить в меню и оглавление.

Скачать исходник + исполняемый файл

Эта задача возникает при разнообразных квази-3D, изометрических отрисовках, построении графиков, диаграмм. Ниже примеры задач, где мне это понадобилось.

Конструктор муссовых десертов. GDI+. Изометрия.
Диаграмма направленности антенны. GDI+. Изометрия

Перейдем непосредственно к задаче. Т.к. сайт ориентирован на программирование, и в первую очередь на Delphi, поэтому исходим из того, что эллипс задается прямоугольником, в который он вписан.

Теория

Рис.1. Постановка задачи

Формулировка

Есть эллипс, вписанный в некий прямоугольник. Точка [X0;Y0] – координаты центра. Есть точка в пространстве [X2;Y2]. Необходимо найти координаты [X;Y] и [X1;Y1], которые являются точками пересечения эллипса и прямой, проходящей через точки [X0;Y0] и [X2;Y2].

Rx и Ry – полуоси эллипса, радиусы по X и Y. Аналог a и b в теории.

Формула эллипса для нашего случая:

(1) Уравнение эллипса

Формула прямой для нашего случая:

(2) Уравнение прямой

Нам известны все координаты, кроме X, Y. Решаем систему уравнений (1),(2).

Выразим Y из формулы (2):

(3) Уравнение для Y

Преобразуем (3) к привычному виду линейной зависимости:

(4)

Подставим (4) в формулу (1):

(5)

Подставим вместо b выражение (Y0k x0) , и получим в верхней части второго слагаемого такую запись:

kx – kx0 = k(x –x0).

Таким образом, формула (5) вырождается в:

(6)

В формуле (6) заменим результат на константу:

(7) Константа

Преобразуем формулу (6), учитывая (7), к следующему виду:

x2 – 2 x0 x + (x02 – ω) = 0

Решаем квадратное уравнение и получаем:

Помним, что:

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

Находим x и x1 по формулам :

(8) Итоговые уравнения для x и x1

Практика

Напишем функцию, реализующую представленный выше расчет.

В коде присутствуют какие-то непонятные типы. Чтобы функция скомпилировалась, надо в предложение Uses добавить xIPDraw. Либо добавить сверху следующий код.
Выдержка из xIPDraw по используемым типам:

Пример использования

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

  1. Приятный и функциональный интерфейс, показывающий работу алгоритма в максимально большем количестве аспектов.
  2. Показать рабочий пример работы с GDI+, т.к. сайт в значительной степени ориентирован на него.
  3. Показать рабочий пример представленного здесь GDI+ Canvas. Продемонстрировать одну из возможностей, а именно – используя стандартный GDI и TCanvas, рисовать между тем с возможностями GDI+.

Клик мышки по полю со схемой блокирует/разблокирует реакцию на курсор. Т.е. линия, пересекающая эллипс, «застывает». Слева три режима отрисовки. Галка AntiAlias снимает/устанавливает режим сглаживания линий.

Пример использования функции

Если Вы скачали и настроили GDI+ Canvas, подкаталог GDIPCanvas в примере становится неактуальным. Имеет смысл удалить его и убрать в опциях проекта SearchPath запись «GDIPCanvas\»:

Опции проекта

P.S.

Меня опять терзают смутные сомнения… У Шпака — магнитофон, у посла — медальон…

Бунша И.В.

Функцию можно использовать, скажем, для нахождения координат точки на линии эллипса, отстоящей на angle градусов. Пишем что-то типа следующего:

  • sn, cs – синус и косинус угла angle (в градусах).
  • Cnt – координаты центра
  • W – ширина прямоугольника, описывающего эллипс
  • P – точка линии, проходящей через центр.
  • v – результат, точка на эллипсе.

Неужели нет другого способа? Это ж могучая тригонометрия, должен же быть способ сразу посчитать координаты. Смущает искусственность способа – по углу найти точку линии, а потом найти ее пересечение.

Конечно же такой способ есть. Это ж могучая тригонометрия.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Не нашли ответ на свой вопрос? Задайте его здесь!...x