Umkreismittelpunkt

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Eingeproggt

Betreff: Umkreismittelpunkt

BeitragMo, Jan 28, 2008 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Jan 28, 2008 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDi, Jan 29, 2008 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke.. Nur hab ich deine Erklärung leider nicht kapiert Sad

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 Smile

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

BeitragMi, Jan 30, 2008 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group