Грузоперевозки

Как вычислить пересекающиеся круги в c ++

Как Вычислить Пересекающиеся Круги в C ++. Вычисление пунктов пересечения двух кругов является несколько хитрой проблемой в геометрии, но решение является прямым и простым осуществить в C ++. Вы будете нуждаться в своего рода классе пункта, доступном, который может обращаться с основной арифметикой, такой как дополнение и вычитание 2-мерных пунктов. Если...

Проверьте на Особые случаи

1

Вычислите расстояние между центрами кругов:

Дельта пункта = p2 - p1; пустите в ход distanceSquared = дельта. X * дельта. X + дельта. Y * дельта. Y; расстояние плавания = sqrt (distanceSquared);

2

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

если (distSquared> (r1 + r2) * (r1 + r2)) возвращают noIntersections;

3

Проверьте, ли один круг полностью в пределах другого. В этом случае также не будет никаких решений.

если (distSquared < (r1 - r2) * (r1 - r2)) return noInersections;

4

Проверьте, идентичны ли круги. Это означает, что есть бесконечное число решений - один для каждого пункта на круге.

если (distSquared == 0 && r1 == r2) возвращают infiniteIntersections;

Найдите Пересечения

5

Вычислите расстояние от центра первого круга к аккорду, соединяющему пункты пересечения.

пустите в ход chordDistanceSquared = (r1 * r1 - r2 * r2 - distSquared) * (r1 * r1 - r2 * r2 - distSquared) / (4 * distSquared); пустите в ход chordDistance = sqrt (chordDistanceSquared);

6

Вычислите половину длины аккорда:

пустите в ход halfChordLength = sqrt (r1 * r1 - chordDistanceSquared);

7

Найдите пункт в центре аккорда:

Укажите chordMidpoint = p1 + chordDistance * дельта / sqrt (distSquared);

8

Вычислите местоположения пунктов пересечения, используя информацию, которую Вы до сих пор вычисляли:

Intersection1.x = chordMidpoint.x + chordDistance * (p2.y - p1.y) / расстояние; Intersection1.y = chordMidpoint.y + chordDistance * (p2.x - p1.x) / расстояние; Intersection2.x = chordMidpoint.x - chordDistance * (p2.y - p1.y) / расстояние; Intersection2.y = chordMidpoint.y - chordDistance * (p2.x - p1.x) / расстояние;