Исходник программы, показывающей пример решения теоремы Монжа: если 3 пары общих внешних касательных к 3-м окружностям существуют и пересекаются, то точки пересечения коллинеарны (лежат на одной прямой).
Для существующих касательных линий ни одна окружность не может целиком содержаться внутри другой. Для пересечения трех пар касательных линий, соединяющих окружность, никакие 2 окружности не могут иметь одинаковый радиус.
Программа определяет 3 случайных окружности, которые удовлетворяют вышеуказанным условиям (уникальные размеры и не полностью перекрываются), а также удовлетворяют дополнительному требованию, чтобы пересечения происходили в видимой области изображения. Вы можете использовать клики мыши по окружностям и перетаскивание, чтобы менять их размеры. Касательные линии отображаются автоматически по мере изменения окружностей.
Нажатие левой кнопки мыши на центр круга или рядом с ним запускает операцию перемещения. Нажатие возле края круга и внутри круга запускает операцию изменения размера. Каждая операция перемещения мыши с нажатой левой кнопкой рисует все существующие окружности и касательные, а также линию, соединяющую точки пересечения, если они существуют.
После того, как окружности нарисованы, их можно перемещать и изменять размер по желанию, чтобы попытаться опровергнуть теорему (или сломать программу :-).
Заметки к исходнику
В модуле UGeometry были добавлены процедуры для решения самых сложных математических частей задачи (вращение и перенос прямых, пересечения окружности с окружностью, касательные точки к окружности и внешние касательные окружности к окружности).
Использование данных процедур рисования касательных к окружностям является основным проблемным местом при рисовании изображения. Было решено использовать TPaintbox как элемент управления для повышения эффективности рисования. Процедура Paint перерисовывает фигуру каждый раз при ее вызове. Установка свойства двойной буферизации формы устраняет мерцание при перерисовке фигур.
Фигуры
- Окружности (Круги: массив [1..3] TCircle;)
- Касательные линии, Касательные; массив [1..6] TLine;
- Линия, соединяющая точки пересечения каждой из 3 пар касательных, фактически проведенная как две линии, MongeLine1 и MongeLine2, от каждой из двух наиболее удаленных точек пересечения до третьей точки.
Кнопка «Создать случайные окружности» создает случайный допустимый набор фигур с касательными, пересекающимися в границах рамки для рисования.