Недавно добавленные исходники

•  TDictionary Custom Sort  535

•  Fast Watermark Sources  899

•  3D Designer  1 827

•  Sik Screen Capture  1 474

•  Patch Maker  1 482

•  Айболит (remote control)  1 406

•  ListBox Drag & Drop  1 174

•  Доска для игры Реверси  21 785

•  Графические эффекты  1 354

•  Рисование по маске  1 294

•  Перетаскивание изображений  1 096

•  Canvas Drawing  968

•  Рисование Луны  813

•  Поворот изображения  770

•  Рисование стержней  814

•  Paint on Shape  493

•  Генератор кроссвордов  762

•  Головоломка Paletto  667

•  Теорема Монжа об окружностях  855

•  Пазл Numbrix  617

 

 

Архив исходников

   
  Базы данных
  Графика & Мультимедиа
  Сети & Интернет
  Система
  Разное
   

Ссылки и Баннеры ...

 

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.», что в переводе означает «Мы прибыли в пункт назначения».

Просмотры: 399
Дата: 01.07.2021, Автор: Gary Darby
Написать сообщение:
 

 

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

 

© 2004-2022 "DS"

Соглашение пользователя / Реклама / Карта сайта             Created by BrokenByte Software