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

•  TDictionary Custom Sort  1 436

•  Fast Watermark Sources  1 620

•  3D Designer  2 681

•  Sik Screen Capture  2 024

•  Patch Maker  2 180

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

•  ListBox Drag & Drop  1 652

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

•  Графические эффекты  2 047

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

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

•  Canvas Drawing  1 381

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

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

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

•  Paint on Shape  779

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

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

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

•  Пазл Numbrix  870

 

 

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

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

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

 

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

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

Комментарии пользователей:
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 Кб)     Регистрация >>

 

© 2004-2023 "DS"

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