Umkreismittelpunkt
Übersicht

![]() |
EingeproggtBetreff: Umkreismittelpunkt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo.
Ich würde gern den Umkreismittelpunkt oder besser gesagt Umkugelmittelpunkt dreier Punkte berechnen. Warum schreib ich das hier und nicht in irgendnem Mathe-Forum? Nach ca einer halben Stunde Suchen hab ich die Nase voll von diesen Matheforen. Ich hab mir mal Themen angeschaut, die mein Problem wiederspiegeln. Die Hilfe darauf war "Der Umkreismittelpunkt ist der Schnittpunkt aller Seitensenkrechten".... Toll das weiß ich seit 7 Jahren. Ich würd gern wissen, wie man sich das berechnet. Und genau an dem Punkt hören die Mathe-Foren-Themen meistens auf. Zwei Lösungsansätze hab ich gefunden, nur liefern mir die nicht ganz das, was ich wollte. a / cos al = b / cos be = c / cos ga Diese Formel stimmt nicht. Also als ich das nachrechnete, kam jedesmal was anderes raus. Wenn ein Winkel 90° ist, kann man die Formel sowieso vergessen -> Cos(90)=0 -> undefiniert. X3=(1/a)/(1/b)/(1/c) Mit dem Ergebnis fang ich leider nix an. Was sagt mir das? Vektorrechnung ist nicht grad mein Steckenpferd, aber ich hoffe darauf, dass das jemand verständlich erklären kann. Bitte! mfG, Christoph. |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Moved
Fragen im Stil von "ich hatte keinen Bock mehr nach 30min, könntet ihr nicht ma" sind im Beginners-Corner zu Hause. Zur Frage: Da du 3 Geraden hast, hast du auch 3 Geradengleichungen der Form a*x + b*y + c*z = const -> einfach die Konstanten auf 1 normieren (sprich die ganze gleichung durch const -> a/const, ... ), dann kannst du daraus ein gleichungssystem mit 3 gleichungen und 3 unbekannten aufstellen, was dann ganz einfach mit Gauss Algorithmus / L-R Zerlegung / L-U Zerlegung gelöst werden kann und zwar eindeutig sofern es eine Lösung gibt. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke.. Nur hab ich deine Erklärung leider nicht kapiert ![]() Bevor ich dumm nachfragte, hab ich mich nochmal uf die Suche gemacht und nen C++ Code gefunden. und nein, ich nerv nichtmal mit "Könnt ihr mir das übersetzen"... Das hab ich in diesem einfachen Fall sogar selbst getan ![]() Für alle, die irgendwann mal mein Problem haben und bei deren eigenen Überlegungen nur Müll rauskommt: ACHTUNG: Das is nur eine 2D-Lösung! Code: [AUSKLAPPEN] Global xc#,yc#,r# ;Kreismittelunktkoordinaten und-Radius
Const EPSILON#=0.000001 Function CircumCircle(xp#,yp#,x1#,y1#,x2#,y2#,x3#,y3#) Local m1#,m2#,mx1#,mx2#,my1#,my2# Local dx#,dy#,rsqr#,drsqr# If (Abs(y1-y2)<EPSILON And Abs(y2-y3)<EPSILON) Then Return False ElseIf(Abs(y2-y1)<EPSILON)Then m2=-(x3-x2)/(y3-y2) mx2=(x2+x3)/2.0 my2=(y2+y3)/2.0 xc=(x2+x1)/2.0 yc=m2*(xc-mx2)+my2 ElseIf Abs(y3-y2)<EPSILON Then m1=-(x2-x1)/(y2-y1) mx1=(x1+x2)/2.0 my1=(y1+y2)/2.0 xc=(x3+x2)/2.0 yc=m1*(xc-mx1)+my1 Else m1=-(x2-x1)/(y2-y1) m2=-(x3-x2)/(y3-y2) mx1=(x1+x2)/2.0 mx2=(x2+x3)/2.0 my1=(y1+y2)/2.0 my2=(y2+y3)/2.0 xc=(m1*mx1-m2*mx2+my2-my1)/(m1-m2) yc=m1*(xc-mx1)+my1 EndIf dx=x2-xc dy=y2-yc rsqr=dx*dx+dy*dy r=Sqr(rsqr) dx=xp-xc dy=yp-yc drsqr=dx*dx+dy*dy Return (drsqr<=rsqr) End Function Originalkommentar hat Folgendes geschrieben: ////////////////////////////////////////////////////////////////////////
// CircumCircle() : // Return true if a point (xp,yp) is inside the circumcircle made up // of the points (x1,y1), (x2,y2), (x3,y3) // The circumcircle centre is returned in (xc,yc) and the radius r // Note : A point on the edge is inside the circumcircle //////////////////////////////////////////////////////////////////////// mfG, Christoph. PS: Ich will da keine große Klappe riskieren, aber findest du echt, dass das Thema in die Beginnercorner gehört? Das geht doch schon etwas über "die ersten Schritte mit BlitzBasic" hinweg, oder? |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
![]() |
BlitzMoritz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alternativ möchte ich folgende kleinen Funktionen anbieten,
mit denen man manches Nützliche aus der elementaren Geometrie leicht und anschaulich umsetzen kann (neben dem Umkreis ist übrigens auch der Inkreis dabei): Code: [AUSKLAPPEN] Graphics 1024,768
Local Dreieck:Float[] = [0.0, 0.0, 600.0, 200.0, 200.0, 500.0] Local KreisA:Float[3] Local KreisB:Float[3] Repeat Cls Dreieck[0] = MouseX() Dreieck[1] = MouseY() KreisA = Umkreis(Dreieck[0],Dreieck[1],Dreieck[2],Dreieck[3],Dreieck[4],Dreieck[5]) KreisB = Inkreis(Dreieck[0],Dreieck[1],Dreieck[2],Dreieck[3],Dreieck[4],Dreieck[5]) '---------------------------- SetColor 255,255,0 DrawText "Demonstration Um- und Inkreis eines Dreiecks", 10,10 SetColor 0,0,255 DrawOval KreisA[0]-KreisA[2],KreisA[1]-KreisA[2],2*KreisA[2],2*KreisA[2] SetColor 0,255,0 DrawPoly Dreieck SetColor 255,0,0 DrawOval KreisB[0]-KreisB[2],KreisB[1]-KreisB[2],2*KreisB[2],2*KreisB[2] Flip Until KeyDown(KEY_ESCAPE) Or MouseDown(1) Or MouseDown(2) End '############################################################################# Function Umkreis:Float[](Px1:Float , Py1:Float, Px2:Float , Py2:Float, Px3:Float , Py3:Float) 'Diese Funktion berechnet den Schnittpunkt der Mittelsenkrechten zweier Dreiecksseiten 'welcher den Mittelpunkt des Umkreises bildet, deren Koordinaten die ersten beiden Werte 'jenes dreidimensionalen Float-Arrays bilden, welchen die Funktion zurückgibt; 'der dritte Wert ist der Radius des Umkreises. Local Rueckgabe:Float[3] Local Mittelpunkt:Float[2] Mittelpunkt = Geradenschnittpunkt(0.5*(Px1+Px2),0.5*(Py1+Py2), ( Steigungswinkel(Px1,Py1,Px2,Py2) + 90 ) Mod 360, 0.5*(Px2+Px3),0.5*(Py2+Py3), ( Steigungswinkel(Px2,Py2,Px3,Py3) + 90 ) Mod 360) If Mittelpunkt = Null Then Return [0.0,0.0,0.0] Rueckgabe[0] = Mittelpunkt[0] Rueckgabe[1] = Mittelpunkt[1] Rueckgabe[2] = Sqr( (Px1 - Mittelpunkt[0])^2 + (Py1 - Mittelpunkt[1])^2 ) '(Radius über Pythagoras) Return Rueckgabe End Function '############################################################################# Function Inkreis:Float[](Px1:Float , Py1:Float, Px2:Float , Py2:Float, Px3:Float , Py3:Float) 'Diese Funktion berechnet den Schnittpunkt der Winkelhalbierenden eines Dreiecks, 'welcher den Mittelpunkt des Inkreises bildet, deren Koordinaten die ersten beiden Werte 'jenes dreidimensionalen Float-Arrays bilden, welchen die Funktion zurückgibt; 'der dritte Wert ist der Radius des Inkreises. Local Rueckgabe:Float[3] Local Mittelpunkt:Float[2] Local Winkelhalbierende:Float[2] Local Hilfswinkel:Float = Steigungswinkel(Px1, Py1, Px2, Py2) Winkelhalbierende[0] = 0.5 * ( Hilfswinkel + Steigungswinkel(Px1, Py1, Px3, Py3) ) Winkelhalbierende[1] = 0.5 * ( ((Hilfswinkel + 180) Mod 360) + Steigungswinkel(Px2, Py2, Px3, Py3) ) Mittelpunkt = Geradenschnittpunkt(Px1,Py1,Winkelhalbierende[0],Px2,Py2,Winkelhalbierende[1]) If Mittelpunkt = Null Then Return [0.0,0.0,0.0] Rueckgabe[0] = Mittelpunkt[0] Rueckgabe[1] = Mittelpunkt[1] Local Fusspunkt:Float[2] '(um den Abstand von den Seiten zu erhalten) Fusspunkt = Geradenschnittpunkt(Px1,Py1,Hilfswinkel,Mittelpunkt[0],Mittelpunkt[1], (Hilfswinkel + 90 ) Mod 360) Rueckgabe[2] = Sqr( (Mittelpunkt[0] - Fusspunkt[0])^2 + (Mittelpunkt[1] - Fusspunkt[1])^2 ) '(Radius über Pythagoras) Return Rueckgabe End Function '############################################################################# Function Geradenschnittpunkt:Float[](Px1:Float , Py1:Float , Winkel1:Float, Px2:Float , Py2:Float, Winkel2:Float) 'Diese Funktion gibt (falls vorhanden) den Schnittpunkt zweier Geraden zurück, die an den Fixpunkten '(Px1,Py1) bzw. (Px2,Py2) aufgehängt sind und die Steigunswinkel Winkel1 bzw. Winkel2 besitzen. 'Der Schnittpunkt wird als zweidimensionaler Float-Array zurückgegeben. If Abs(Abs(Winkel1 Mod 180) - Abs(Winkel2 Mod 180)) < 0.001 Then Return Null Local Faktor:Float Local Schnittpunkt:Float[2] If Abs(Cos(Winkel1)) < 0.001 Then Faktor = (Px1-Px2) / Cos(Winkel2) Schnittpunkt[0] = Px2 + Faktor * Cos(Winkel2) Schnittpunkt[1] = Py2 + Faktor * Sin(Winkel2) ElseIf Abs(Sin(Winkel2)) < 0.001 Then Faktor = (Py2-Py1) / Sin(Winkel1) Schnittpunkt[0] = Px1 + Faktor * Cos(Winkel1) Schnittpunkt[1] = Py1 + Faktor * Sin(Winkel1) Else Faktor = (Py1-Py2 + (Px2-Px1) * Tan(Winkel1) ) / (Sin(Winkel2)*(1-Tan(Winkel1)/Tan(Winkel2) ) ) Schnittpunkt[0] = Px2 + Faktor * Cos(Winkel2) Schnittpunkt[1] = Py2 + Faktor * Sin(Winkel2) End If Return Schnittpunkt End Function '############################################################################# Function Steigungswinkel:Float(Px1:Float , Py1:Float , Px2:Float , Py2:Float) 'Diese Funktion gibt einen Winkel größer 0° und kleiner gleich 360° zurück, 'der von der Geraden durch die zwei Punkte (Px1,Py1) und (Px2,Py2) gebildet wird. 'Nicht vergessen: Die (schulmathematisch falsche) Drehrichtung IM Uhrzeigersinn resultiert 'aus dem (ebenfalls schulmathematisch falschen) Koordinatenursprung links OBEN! If Px1 < Px2 Then If Py1 < Py2 Then Return ATan(1.0 * (Py2 - Py1) / (Px2 - Px1) ) Else Return 360+ATan(1.0 * (Py2 - Py1) / (Px2 - Px1) ) End If ElseIf Px2 < Px1 Then Return (180 + ATan(1.0 * (Py2 - Py1) / (Px2 - Px1) ) ) ElseIf Py1 < Py2 Then Return 90 Else Return 270 End If End Function '############################################################################# Tschüss |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group