Общайтесь с несколькими серверами SQL в любое время

Это решение, которое я нашел, выглядело немного легче, чем некоторые другие.

Принимая:

p1 and p2 as the points for the line, and
c as the center point for the circle and r for the radius

Я решил бы для уравнения линии в форме перехвата склонов. Тем не менее, я не хотел иметь дело с сложными уравнениями с c как точкой, поэтому я просто сдвинул систему координат так, чтобы круг находился в 0,0

p3 = p1 - c
p4 = p2 - c

By путь, когда я вычитаю точки друг от друга, я вычитаю x, а затем вычитаю y и помещаю их в новую точку, на случай, если кто-то не знает.

В любом случае, теперь я решаю для уравнения линии с p3 и p4:

m = (p4_y - p3_y) / (p4_x - p3) (the underscore is an attempt at subscript)
y = mx + b
y - mx = b (just put in a point for x and y, and insert the m we found)

Ok. Теперь мне нужно установить эти уравнения равными. Сначала мне нужно решить уравнение круга для x

x^2 + y^2 = r^2
y^2 = r^2 - x^2
y = sqrt(r^2 - x^2)

. Тогда я установил их равными:

mx + b = sqrt(r^2 - x^2)

И решим для квадратичного уравнения (0 = ax^2 + bx + c):

(mx + b)^2 = r^2 - x^2
(mx)^2 + 2mbx + b^2 = r^2 - x^2
0 = m^2 * x^2 + x^2 + 2mbx + b^2 - r^2
0 = (m^2 + 1) * x^2 + 2mbx + b^2 - r^2

Теперь у меня есть a, b и c.

a = m^2 + 1
b = 2mb
c = b^2 - r^2

Итак, я поместил это в квадратичную формулу:

(-b ± sqrt(b^2 - 4ac)) / 2a

И замените значения на значения, а затем упростите как можно больше:

(-2mb ± sqrt(b^2 - 4ac)) / 2a
(-2mb ± sqrt((-2mb)^2 - 4(m^2 + 1)(b^2 - r^2))) / 2(m^2 + 1)
(-2mb ± sqrt(4m^2 * b^2 - 4(m^2 * b^2 - m^2 * r^2 + b^2 - r^2))) / 2m^2 + 2
(-2mb ± sqrt(4 * (m^2 * b^2 - (m^2 * b^2 - m^2 * r^2 + b^2 - r^2))))/ 2m^2 + 2
(-2mb ± sqrt(4 * (m^2 * b^2 - m^2 * b^2 + m^2 * r^2 - b^2 + r^2)))/ 2m^2 + 2
(-2mb ± sqrt(4 * (m^2 * r^2 - b^2 + r^2)))/ 2m^2 + 2
(-2mb ± sqrt(4) * sqrt(m^2 * r^2 - b^2 + r^2))/ 2m^2 + 2
(-2mb ± 2 * sqrt(m^2 * r^2 - b^2 + r^2))/ 2m^2 + 2
(-2mb ± 2 * sqrt(m^2 * r^2 + r^2 - b^2))/ 2m^2 + 2
(-2mb ± 2 * sqrt(r^2 * (m^2 + 1) - b^2))/ 2m^2 + 2

Это почти настолько, насколько это будет упрощено. Наконец, выделите уравнения с помощью ±:

(-2mb + 2 * sqrt(r^2 * (m^2 + 1) - b^2))/ 2m^2 + 2 or     
(-2mb - 2 * sqrt(r^2 * (m^2 + 1) - b^2))/ 2m^2 + 2 

. Затем просто подключите результат обоих этих уравнений к x в mx + b. Для ясности я написал код JavaScript, чтобы показать, как это использовать:

function interceptOnCircle(p1,p2,c,r){
    //p1 is the first line point
    //p2 is the second line point
    //c is the circle's center
    //r is the circle's radius

    var p3 = {x:p1.x - c.x, y:p1.y - c.y} //shifted line points
    var p4 = {x:p2.x - c.x, y:p2.y - c.y}

    var m = (p4.y - p3.y) / (p4.x - p3.x); //slope of the line
    var b = p3.y - m * p3.x; //y-intercept of line

    var underRadical = Math.pow((Math.pow(r,2)*(Math.pow(m,2)+1)),2)-Math.pow(b,2)); //the value under the square root sign 

    if (underRadical < 0){
    //line completely missed
        return false;
    } else {
        var t1 = (-2*m*b+2*Math.sqrt(underRadical))/(2 * Math.pow(m,2) + 2); //one of the intercept x's
        var t2 = (-2*m*b-2*Math.sqrt(underRadical))/(2 * Math.pow(m,2) + 2); //other intercept's x
        var i1 = {x:t1,y:m*t1+b} //intercept point 1
        var i2 = {x:t2,y:m*t2+b} //intercept point 2
        return [i1,i2];
    }
}

Надеюсь, это поможет!

P.S. Если кто-либо находит какие-либо ошибки или имеет какие-либо предложения, прокомментируйте. Я очень новый и приветствую всю помощь / предложения.

-1
задан marc_s 13 July 2018 в 15:35
поделиться