обнаружение угла столкновения между двумя окружностями - PullRequest
0 голосов
/ 26 октября 2018

Я обнаруживаю столкновение между двумя кругами следующим образом:

var circle1 = {radius: 20, x: 5, y: 5}; //moving
var circle2 = {radius: 12, x: 10, y: 5}; //not moving

var dx = circle1.x - circle2.x;
var dy = circle1.y - circle2.y;
var distance = Math.sqrt(dx * dx + dy * dy);


if (distance < circle1.radius + circle2.radius) {
    // collision detected
}

Мой вопрос: как я могу определить угол столкновения circle2? (circle2 не движется). Буду признателен за любое объяснение

Ответы [ 2 ]

0 голосов
/ 26 октября 2018

Решение:

Мне кажется, я понял:

arccos((ra^2+rb^2-c^2)/(2*ra*rb))

где:

  • c - расстояние между центрами обоих кругов (distance в вашем вопросе)
  • ra - радиус первого круга
  • rb - радиус второго круга

Код: В JavaScript с вашими значениями это должно дать:

const angleInRadians = Math.acos((circle1.radius*circle1.radius + circle2.radius*circle2.radius - distance*distance)/(2*circle1.radius*circle2.radius))

Обратите внимание, что результат в радианах , см. документ для acos

Если вы хотите получить его в градусах , просто используйте преобразование:

const angleInDegrees = angleInRadians / Math.PI * 180

Объяснение:

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

Угол между касательными такой же, как угол между соответствующими радиусами (поскольку радиусы ортогональны касательным линиям).

Чтобы получить угол между радиусами:

Нарисуйте треугольник между обоими центрами и одной из точек пересечения. Используйте закон косинусов , основанный на угле в точке пересечения.

c^2 = ra^2 + rb^2 - 2*ra*rb*cos(alpha)

sketch of 2 circles intersecting

Если вам нужны дополнительные объяснения, не стесняйтесь спрашивать в комментариях.

0 голосов
/ 26 октября 2018

Вы можете определить угол с помощью простой тригонометрии.

тангенс = противоположный / прилагательный

То есть let angle = Math.atan(dy/dx)

...