Обнаружение столкновений между линией и окружностью в JavaScript

Я ищу точный ответ, возможно, функцию, потому что я медленный, который определит, столкнулись ли отрезок и окружность линии, в javascript (работа с canvas)

Функция, подобная приведенной ниже, просто возвращает true, если столкнулся, или false, если нет, было бы здорово. Я мог бы даже подарить тебе ребенка.

function isCollided(lineP1x, lineP1y, lineP2x, lineP2y, circlex, circley, radius) {

    ...
}

Я нашел много формул,как этот, но они над моей головой.

 Derek 朕會功夫09 июн. 2012 г., 03:40
Факты: формула круга:(x−h)^2+(y−k)^2=r^2 Линия формула:y=a+bx Вы можете решить для этих 2 формул, и если вы можете получить ответ, то происходит столкновение.
 Oliver Charlesworth09 июн. 2012 г., 03:29
Ну, даже если вы не следовали математике, там был код, представленный в ответе, который должен быть вам полезен.
 Derek 朕會功夫09 июн. 2012 г., 03:31
Это как раз тот момент, когда ваша школьная алгебра поможет вам в вашей жизни.
 Jarrod09 июн. 2012 г., 03:31
@ Оли Чарльзуорт: Я бы тоже так подумал. Но я запутался в первой строке: "float a = d.Dot (d)" :)
 Jarrod09 июн. 2012 г., 03:32
@Derek: согласен. Сейчас мне 30, лысеет и мне нечего показать.

Ответы на вопрос(3)

чтобы сделать его идеальным. Надеюсь, это поможет.

function collisionCircleLine(circle,line){ // Both are objects

    var side1 = Math.sqrt(Math.pow(circle.x - line.p1.x,2) + Math.pow(circle.y - line.p1.y,2)); // Thats the pythagoras theoram If I can spell it right

    var side2 = Math.sqrt(Math.pow(circle.x - line.p2.x,2) + Math.pow(circle.y - line.p2.y,2));

    var base = Math.sqrt(Math.pow(line.p2.x - line.p1.x,2) + Math.pow(line.p2.y - line.p1.y,2));

    if(circle.radius > side1 || circle.radius > side2)
        return true;

    var angle1 = Math.atan2( line.p2.x - line.p1.x, line.p2.y - line.p1.y ) - Math.atan2( circle.x - line.p1.x, circle.y - line.p1.y ); // Some complicated Math

    var angle2 = Math.atan2( line.p1.x - line.p2.x, line.p1.y - line.p2.y ) - Math.atan2( circle.x - line.p2.x, circle.y - line.p2.y ); // Some complicated Math again

    if(angle1 > Math.PI / 2 || angle2 > Math.PI / 2) // Making sure if any angle is an obtuse one and Math.PI / 2 = 90 deg
        return false;


        // Now if none are true then

        var semiperimeter = (side1 + side2 + base) / 2;

        var areaOfTriangle = Math.sqrt( semiperimeter * (semiperimeter - side1) * (semiperimeter - side2) * (semiperimeter - base) ); // Heron's formula for the area

        var height = 2*areaOfTriangle/base;

        if( height < circle.radius )
            return true;
        else
            return false;

}

И вот как ты это делаешь ..

аhttps://www.npmjs.com/package/line-circle-collision, API прост:

var circle = [5, 5],
    radius = 25,
    a = [5, 6],
    b = [10, 10]

var hit = collide(a, b, circle, radius)
Решение Вопроса

enter image description here Это основная концепция, если вы не знаете, как решать уравнения в целом. Я оставлю остальную часть мышления вам. ;) ВыяснениеCDдлина не так уж сложна.

Если вы спрашиваете, как, то вот как: enter image description here Найти коллизии в JavaScript довольно сложно.

Ваш ответ на вопрос