Berührungspunkte zweier Kreise (C++)

Neue Frage »

lokalhorst Auf diesen Beitrag antworten »
Berührungspunkte zweier Kreise (C++)
Meine Frage:
Hallo Zusammen,

leider kriege ich mit meinen Sourcecode nicht die richtigen Ergebnise. Schon vieles probiert (händisch nachrechnen und mit Debugging Werten vergleichen;...)

Danke gleich mal für Anregungen!!

Meine Ideen:
Mein Code:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
!Point * PaintWidget::getIntersectionPoints(double ka, double ha, double ra, double kb, double hb, double rb)
{
    Point m2_m1;
    m2_m1.x = kb - ka;
    m2_m1.y = hb + rb - ha - ra;

    double Abstand_MitteDerZweiUnterenCoils = qSqrt( m2_m1.x*m2_m1.x + m2_m1.y*m2_m1.y ) ;

    if( Abstand_MitteDerZweiUnterenCoils > ra + rb )
    {
        qDebug() << "ERROR: keine oder unendlich viele Schnittpunkte!";
        return 0;
    }

    double sqrt_rara_rbrb = qSqrt( ra*ra + rb*rb );
    double Punkt = ( sqrt_rara_rbrb / Abstand_MitteDerZweiUnterenCoils  + 1 ) / 2;

    Point d1;
    d1.x    = Punkt * m2_m1.x;
    d1.y    = Punkt * m2_m1.y;
    double NormVonD1 = qSqrt( d1.x*d1.x + d1.y*d1.y );

    Point e;
    e.x = - m2_m1.y / Abstand_MitteDerZweiUnterenCoils;
    e.y =   m2_m1.x / Abstand_MitteDerZweiUnterenCoils;

    double l = qSqrt( ra*ra - NormVonD1*NormVonD1 );

    double tmp_d = ka + d1.x;
    Point  tmp_p;
    if(ra*ra - NormVonD1*NormVonD1 <= 0) tmp_p.x = e.x;
    else tmp_p.x = l * e.x;
    if(ra*ra - NormVonD1*NormVonD1 <= 0) tmp_p.y = e.y;
    else tmp_p.y = l * e.y;

    Point * Ergebnis = new Point[2];
    Ergebnis[0].x    = tmp_d + tmp_p.x;
    Ergebnis[0].y    = 0;

    Ergebnis[1].x    = tmp_d - tmp_p.x;
    Ergebnis[1].y    = 0;
    return Ergebnis;
}


Zwei Beiträge zusammengefasst. Steffen

Hallo nochmal,

ich sollte vielleicht hier noch etwas ausführlicher beschreiben:
Die Vorgehensweise ist, dass man von Mittelpunkt des ersten Kreises zur Schnittgerade der zwei Kreise geht. Anschließend geht man noch l mal den Orthogonalvektor. (Analog wie im Wikipedia Artikel: Schnittpunkte #Alternative_Berechnungsmethode). Probleme habe ich mit dem Vektor d1 der vom Mittelpunkt des ersten Kreises zur Schnittgerade der wie folgt beschrieben ist:

mein Code dazu sieht wie folgt aus:
code:
1:
2:
3:
4:
5:
double rara_rbrb = ra*ra + rb*rb;
double Punkt = ( rara_rbrb / Abstand_MitteDerZweiUnterenCoils  + 1 ) / 2;
Point d1;
d1.x    = Punkt * m2_m1.x;
d1.y    = Punkt * m2_m1.y;
Wobei der MitteDerZweiUnterenCoils: Abstand(M2-M1) richtig ist und ich die Berchnung hier nicht zeige. Aber der bei mir genannte "Punkt" müsste ja irgendwo zwischen 0 und 1 liegen weil es nicht ganz 1 mal der Abstand von M1 zu M2 ist.
Danke nochmal für jede Hilfe!!
Steffen Bühler Auf diesen Beitrag antworten »
RE: Berührungspunkte zweier Kreise (C++)
Wenn ich die Formel und Deinen Code dazu betrachte, wundere ich mich, warum es statt
code:
1:
double sqrt_rara_rbrb = qSqrt( ra*ra + rb*rb );
nicht
code:
1:
double sqrt_rara_rbrb = qSqrt( ra*ra - rb*rb );
heißt.

Auch bei der Zeile
code:
1:
double Punkt = ( sqrt_rara_rbrb / Abstand_MitteDerZweiUnterenCoils  + 1 ) / 2;
die ohnehin mit den Zeilen weiter unten
code:
1:
2:
double rara_rbrb = ra*ra + rb*rb;
double Punkt = ( rara_rbrb / Abstand_MitteDerZweiUnterenCoils  + 1 ) / 2;
etwas im Widerspruch steht, frage ich mich, ob es nicht entsprechend der Formel
code:
1:
2:
double rara_rbrb = ra*ra - rb*rb;
double Punkt = ( rara_rbrb / (Abstand_MitteDerZweiUnterenCoils*Abstand_MitteDerZweiUnterenCoils)  + 1 ) / 2;
heißen sollte.

Viele Grüße
Steffen
lokalhorst Auf diesen Beitrag antworten »
Berührungspunkte zweier Kreise (C++)
Ja, es heißt natürlich:
code:
1:
double rara_rbrb = ra*ra - rb*rb;
Da habe ich noch probiert und nicht den richtigen Code reinkopiert. Also Wurzel gehört eigentlich aus der Zeile raus und es wird subtrahiert. Das ist mir bereits aufgefallen aber ich konnte es ohne Account nicht mehr editieren (irgenwie klar! Sonst würd ja noch jed...).
Für den Tipp dass der Abstand auch quadriert gehört bin ich dir sehr dankbar. Der ist mir die ganze Zeit noch nicht aufgefallen. Bringt aber immer noch nicht das richtige Erebniss.
Fällt dir noch etwas auf?

Danke und liebe Grüße
Steffen Bühler Auf diesen Beitrag antworten »
RE: Berührungspunkte zweier Kreise (C++)
Nein, leider nicht. Ich verschieb das doch noch einmal zurück in Geometrie, vielleicht gibt's da jemanden, der sich besser auskennt.

Viele Grüße
Steffen
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »