Как устранить столкновение двух кругов? - PullRequest
1 голос
/ 17 июня 2020

У меня есть два круга с одинаковым радиусом, которые пересекаются друг с другом, мне нужно переместить один из них на некоторые значения X и Y, чтобы они пересекались только в одной точке (чтобы они не пересекались друг с другом. больше). Как рассчитать X и Y, по которым нужно переместить одну из окружностей?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Один из подходов заключается в перемещении каждого круга от другого при обнаружении перекрытия:

Пока расстояние между двумя центрами меньше суммы двух радиусов, перемещайте каждый круг на a немного в стороне от другого .

# r0, r1, epsilon, Scalars representing radii and a small value
# c0, c1, center Points
# ((c1 - c0) / |c1 - c0|) normalized c0c1 vector away from c1
# ((c0 - c1) / |c1 - c0|) normalized c0c1 vector away from c0


while (r0 + r1) > |c1 - c0|:
    c0 = c0 + ((c1 - c0) / |c1 - c0|) * epsilon
    c1 = c1 + ((c0 - c1) / |c1 - c0|) * epsilon

Edit : Пример класса Point (python) для удобной арифметики c:

class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __sub__(self, other) -> Vector:
         return Vector(self.x - other.x, self.y - other.y)
    ...
0 голосов
/ 18 июня 2020
float r // = radius
float A[2] //= coordinates of the center A of the first circle
float B[2] //= coordinates of the center B of the second circle
float AB[2];
float length_AB;
float B_new[2];


AB[0] = B[0] - A[0];
AB[1] = B[1] - A[1];

length_AB = math.sqrt( AB[0]*AB[0] + AB[1]*AB[1] );

AB[0] = 2 * r * AB[0] / length_AB;
AB[1] = 2 * r * AB[1] / length_AB;

B_new[0] = A[0] + AB[0];
B_new[1] = A[1] + AB[1];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...