2016-06-10 17 views
0

Ich versuche zu verstehen, was diese Funktion tut. Es wurde von meinem Lehrer gegeben und ich kann nicht verstehen, was Logik hinter den Formeln ist, die x, und y-Koordinaten finden. Von meinem Mathe-Kurs kenne ich meine Formeln, um das Abfangen zu finden, aber sein verwirrendes übersetzt in Code. Also habe ich einige Probleme damit, wie sie die Formeln für a, b, c und für das Finden der Koordinaten x und y definiert haben.Finden von Schnittpunkten von Linie und Kreis

void Intersection::getIntersectionPoints(const Arc& arc, const Line& line) { 
    double a, b, c, mu, det; 

    std::pair<double, double> xPoints; 
    std::pair<double, double> yPoints; 
    std::pair<double, double> zPoints; 

//(m2+1)x2+2(mc−mq−p)x+(q2−r2+p2−2cq+c2)=0. 
    //a= m2; 
    //b= 2 * (mc - mq - p); 
    //c= q2−r2+p2−2cq+c2 
    a = pow((line.end().x - line.start().x), 2) + pow((line.end().y - line.start().y), 2) + pow((line.end().z - line.start().z), 2); 

    b = 2 * ((line.end().x - line.start().x)*(line.start().x - arc.center().x) 
    + (line.end().y - line.start().y)*(line.start().y - arc.center().y) 
    + (line.end().z - line.start().z)*(line.start().z - arc.center().z)); 

    c = pow((arc.center().x), 2) + pow((arc.center().y), 2) + 
    pow((arc.center().z), 2) + pow((line.start().x), 2) + 
    pow((line.start().y), 2) + pow((line.start().z), 2) - 
    2 * (arc.center().x * line.start().x + arc.center().y * line.start().y + 
    arc.center().z * line.start().z) - pow((arc.radius()), 2); 

    det = pow(b, 2) - 4 * a * c; 

    /* Tangenta na kružnicu */ 
    if (Math<double>::isEqual(det, 0.0, 0.00001)) { 
    if (!Math<double>::isEqual(a, 0.0, 0.00001)) 
     mu = -b/(2 * a); 
    else 
     mu = 0.0; 
//        x =  h   + t * (p   −  h) 
    xPoints.second = xPoints.first = line.start().x + mu * (line.end().x - line.start().x); 
    yPoints.second = yPoints.first = line.start().y + mu * (line.end().y - line.start().y); 
    zPoints.second = zPoints.first = line.start().z + mu * (line.end().z - line.start().z); 
    } 

    if (Math<double>::isGreater(det, 0.0, 0.00001)) { 
    // first intersection 
    mu = (-b - sqrt(pow(b, 2) - 4 * a * c))/(2 * a); 
    xPoints.first = line.start().x + mu * (line.end().x - line.start().x); 
    yPoints.first = line.start().y + mu * (line.end().y - line.start().y); 
    zPoints.first = line.start().z + mu * (line.end().z - line.start().z); 
    // second intersection 

    mu = (-b + sqrt(pow(b, 2) - 4 * a * c))/(2 * a); 
    xPoints.second = line.start().x + mu * (line.end().x - line.start().x); 
    yPoints.second = line.start().y + mu * (line.end().y - line.start().y); 
    zPoints.second = line.start().z + mu * (line.end().z - line.start().z); 
    } 

Antwort

0

Bezeichnen der Startpunkt der Linie, wie A, Endpunkt, wie B, Kreis Zentrum als C, Kreisradius wie R und der Schnittpunkt als P, dann können wir P als

P=(1-t)*A + t*B = A+t*(B-A) (1) 

Punkt schreiben P wird auch auf den Kreis finden, daher

|P-C|^2 = r^2     (2) 

Gleichung Anstecken (1) in die Gleichung (2), erhalten Sie

|B-A|^2*t^2 + 2(B-A)\dot(A-C)*t +(|A-C|^2 - r^2) = 0 (3) 

So erhalten Sie die Formel für a, b und c in dem von Ihnen geposteten Programm. Nachdem Sie für t gelöst haben, erhalten Sie den/die Schnittpunkt (e) aus Gleichung (1). Da Gleichung (3) quadratisch ist, könnten Sie 0, 1 oder 2 Werte für t erhalten, die den geometrischen Konfigurationen entsprechen, bei denen die Linie den Kreis nicht schneidet, genau tangential zum Kreis verläuft oder an zwei Stellen durch den Kreis verläuft.