Delphi Sources

Delphi Sources

 




 

ИСХОДНИК ПРОГРАММЫ

 

. : Пересекающиеся окружности : .

 

Delphi - Рисование пересекающихся окружностей по точкам пересечения

Исходник программы, показывающей пример рисования пересекающихся окружностей по точкам пересечения.

Принцип рисования окружностей

P1 и P2 - центры окружностей, расположенные в точках (x1, y1) и (x2, y2). dx и dy - смещения x и y точки P2 от точки P1.

dx = x2-x1
dy = y2-y1

Пифагор говорит нам, что расстояние между P1 и P2 равно d = sqrt (dx * dx + dy * dy). Если d меньше суммы радиусов кругов r1 + r2, то круги могут пересекаться. (По-прежнему существует вероятность того, что P2 так близко к P1, что полностью содержится внутри и все еще не пересекается. Это верно тогда и только тогда, когда d <| r1-r2 |. Представьте, что окружности концентрические, имеют один и тот же центр. Тогда расстояние от края внутреннего круга до внешнего является абсолютным значением разности радиусов. Если d становится больше, чем это расстояние, круги снова пересекаются, пока не превысит сумму радиусов.

Предполагая, что круги пересекаются, мы хотим найти координаты точек или точек пересечения, IP1 и IP2 (для ясности я оставил метку IP2 на диаграмме выше).

Итак, у нас есть достаточно информации, чтобы найти a и h. Рассматривая прямоугольный треугольник IP1P1P3, мы можем записать cos (a) = a / r1, где a - угол в точке P1.

Также, рассматривая треугольник P1P2IP1, мы можем применить «закон косинуса», чтобы получить другое выражение для cos (a).

Закон косинусов: Cos (a) = (r12 + d2-r22) / (2r1d)
Следовательно, cos (a) = a / r1 = (r12 + d2-r22) / (2r1d) и умножение обеих частей на r1 оставляет а = (r12 - r22 + d2) / (2 d)

Если круги касаются одной точки, вы можете подставить d = r1 + r2 в приведенное выше уравнение и доказать, что a = r1 в единственной точке пересечения.

Как только мы узнаем a, мы можем найти значение h как h = sqrt (r12 - a2).

Уф, еще один важный шаг, чтобы найти фактические координаты точек пересечения. Хитрость здесь состоит в том, чтобы концептуально повернуть точку P3 вниз так, чтобы она лежала на оси x. Мы еще не знаем, что это за угол, но мы назовем его -beta, -b. Тогда координаты P3 относительно P1 будут (a, h). Теперь, если мы повернем через точку (a, h) назад на угол b, то мы окажемся в верхней точке пересечения. Другая точка, если она существует, будет результатом поворота точки (a, -h).

Итак, если мы найдем двумерные уравнения вращения (на этом сайте, например, мы найдем уравнения вращения в точке на заданный угол).

x '= x cos b - y sin b
y '= y cos b + x sin b

Чтобы применить поворот вверх на b, нам нужно его значение или, по крайней мере, значения для sin (b) и cos (b). Они определяются треугольником, образованным сторонами d, dx и dy на приведенной выше диаграмме, поэтому Sin (b) = dy / d и Cos (b) = dx / d. И последнее соображение, поскольку приведенные выше уравнения предполагают, что мы вращаемся вокруг начала координат ((0,0), а на самом деле мы вращаемся вокруг точки P1 в точке (x1, y1), нам нужно перевести окончательные координаты обратно, добавив (x1, y1 ) к повернутым значениям.

Таким образом, наши точки пересечения: IP1.x = x1 + a * dx / d - h * dy / d и IP1.y = y1 + h * dx / d + a * dy / d.

или же

IP1.x = x1 + (a * dx - h * dy) / d и, IP1.y = y1 + (h * dx + a * dy) / d

и для нижнего пересечения (a, -h), повернутого на b

IP2.x = x1 + (a * dx + h * dy) / d и IP2.y = y1 + (-h * dx + a * dy) / d

Как говорится на латыни: «Q.E.D.», что в переводе означает «Мы прибыли в пункт назначения».

Просмотры: 1 578
Дата: 01.07.2021, Автор: Gary Darby
Скачивания: 13

Комментарии пользователей:
ronlegkriss
28 июня 2022
var c1,c2,e,napr:TVector2; // вспомогательные переменные dlina,movi:single; // begin c1.x:=center1.x; // перегоняем во временную переменную c1.y:=center1.y; c2.x:=center2.x; // тоже и для второй точки c2.y:=center2.y; e.x:=(c1.x-c2.x); // определяем вектор, соединяющий точки C1 и C2 e.y:=(c1.y-c2.y); dlina:=sqrt(e.x*e.x+e.y*e.y); // определяем длину вектора (отрезка между C1 и С2) napr:=normaliz2(e); // определяем единичный вектор направления if dlina
   

Написать сообщение:

 

Скачать (21 Кб)     Регистрация >>

 

Соглашение пользователяКонфиденциальностьПравила обработки cookie       BrokenByte Software


Форум по Delphi программированию - Ошибка базы данных

Кажется, произошла проблема с базой данных Форум по Delphi программированию.
Пожалуйста, попробуйте зайти снова, нажав на кнопку Обновить вашего браузера.

Нашей службе технической поддержке был послан email. Вы также можете написать им письмо, если проблема не решиться.

Извените за причинённые неудобства.