Функция JavaScript, которая возвращает точки x, y пересечения между двумя кругами?

enter image description here

Я получил расположение (x, y) центра двух кругов и их радиус, но мне нужно найти их точки пересечения (отмеченные красным) с помощью JavaScript.

Я думаю, что лучшее объяснение в отношении математики найдено here (пересечение двух кругов), но я не знаю, я действительно понимаю математику, поэтому я не могу ее реализовать.

Например, d = || P1 - P0 ||, что делать || стоять? Означает ли это, что результирующее число всегда является положительным?

А также P2 = P0 + a (P1 - P0)/d, не являются ли здесь P чем-то вроде (10, 50)? Но делать (10,50) +13 в JavaScript дает вам 63, так что он просто игнорирует первое число, так что, возможно, произойдет? Должен ли результат быть (23,63) здесь или? А также часть P1-P0 или (40,30) - (10,60), как вы это выражаете в JavaScript?

Ответы

Ответ 1

Перевод функции C на сайт на JavaScript:

function intersection(x0, y0, r0, x1, y1, r1) {
        var a, dx, dy, d, h, rx, ry;
        var x2, y2;

        /* dx and dy are the vertical and horizontal distances between
         * the circle centers.
         */
        dx = x1 - x0;
        dy = y1 - y0;

        /* Determine the straight-line distance between the centers. */
        d = Math.sqrt((dy*dy) + (dx*dx));

        /* Check for solvability. */
        if (d > (r0 + r1)) {
            /* no solution. circles do not intersect. */
            return false;
        }
        if (d < Math.abs(r0 - r1)) {
            /* no solution. one circle is contained in the other */
            return false;
        }

        /* 'point 2' is the point where the line through the circle
         * intersection points crosses the line between the circle
         * centers.  
         */

        /* Determine the distance from point 0 to point 2. */
        a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ;

        /* Determine the coordinates of point 2. */
        x2 = x0 + (dx * a/d);
        y2 = y0 + (dy * a/d);

        /* Determine the distance from point 2 to either of the
         * intersection points.
         */
        h = Math.sqrt((r0*r0) - (a*a));

        /* Now determine the offsets of the intersection points from
         * point 2.
         */
        rx = -dy * (h/d);
        ry = dx * (h/d);

        /* Determine the absolute intersection points. */
        var xi = x2 + rx;
        var xi_prime = x2 - rx;
        var yi = y2 + ry;
        var yi_prime = y2 - ry;

        return [xi, xi_prime, yi, yi_prime];
    }