GDI+ Dreieckskonstruktion - Seitenlängen bekannt

  • Hallo ;)

    Ich bin gerade dabei mich mit GDI+ anzufreunden und versuche deshalb ein kleines Programm zu schreiben, welches Dreiecke zeichnen soll.
    Am Anfang sollen dabei die Seitenlängen für a,b und c des Dreiecks ABC angegeben werden. Nach einem Buttonklick wird das Dreieck analysiert und auf Konstruierbarkeit und Eigenschaften überprüft, was soweit auch alles klappt.

    Über einen weiteren Button wird nun eine ChildGUI aufgerufen, auf der das Dreieck gezeichnet werden soll.

    Mein Denkansatz ist folgender:
    1. An einer Startkoordinate (hier: 125,280) wird die längste der 3 Seiten gezeichnet. Folglich hab ich nun die Koordinaten von A und B
    2. Von dort aus soll nun irgendwie der Punkt C ermittelt werden. Die Abstände AC und BC haben wir ja mit den Seitenlängen bereits gegeben.

    Wie stell ich das nun am besten an? Verwende ich die richtige Funktion?

    Habe es bereits mit 2 Kreisen um A und B probiert, jedoch ist mir die Berechnung einer allgemeinen Formel zur Berechnung des Schnittpunktes zweier Kreise zu kompliziert (der höher gelegen Schnittpunkt wäre C). Es muss doch irgendwie gehen oder nicht?^^ Hoffe ich bekomme hier Hilfe hab Google schon abgenutzt auf Lösungssuche^^

    Hier das Scriptschnipsel zur Dreieckskonstruktion:

    Spoiler anzeigen
    [autoit]

    $Form2 = GUICreate("Dreieck-Zeichner - Dreieck", $iWidth, $iHeight, 234, 173, -1, -1, $Form1)
    ;Zeichenfeld reicht von (0,0) bis (425,305)
    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($Form2)
    $Button5 = GUICtrlCreateButton("Als Bild speichern", 112, 312, 100, 22, $BS_FLAT)
    $Button6 = GUICtrlCreateButton("Zurück", 216, 312, 100, 22, $BS_FLAT)
    $Button7 = GUICtrlCreateButton("Ende", 320, 312, 100, 22, $BS_FLAT) ;macht GDI_Shutdown und GraphicsDispose
    $Button8 = GUICtrlCreateButton("Daten anzeigen", 8, 312, 100, 22, $BS_FLAT)
    GUISetState(@SW_SHOW)
    $x1 = 125
    $y1 = 280
    $x2 = 125+$TriHyp ;TriHyp ist die vorher ermittelte, längste Seite des Dreiecks
    $y2 = 280
    _GDIPlus_GraphicsDrawLine($hGraphic, $x1, $y1, $x2, $y2) ;Die Längste Seite ($TriHyp) wird gezeichnet
    ;-->hier weiß ich nicht weiter bzw ich weiß nicht in Richtung welcher Koordinate ich die anderen beiden Seiten zeichnen sollte

    [/autoit]

    Schöne Grüße, sondaschuela69

  • Hi,
    hier eine Funktion um Dreiecke per Drehung eines Punktes um einen bestimmten Winkel zu erstellen.

    Weiterhin ein Script mit Funktionen um u.a. pythagoräische Dreiecke zu erstellen:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    _GDIPlus_Startup()
    $hGui = GUICreate("", 600, 600)
    GUISetState(@SW_SHOW)
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hPen = _GDIPlus_PenCreate(0xFFFF0000, 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $x1 = 100
    $y1 = 250

    [/autoit] [autoit][/autoit] [autoit]

    $x2 = 200
    $y2 = 200

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawLine($hGraphics, $x1, $y1, $x2, $y2, $hPen) ; Grundlinie
    pyth_Dreieck($x1, $y1, $x2, $y2)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 100 ;10 zufällige rechtwinklige dreiecke
    _GDIPlus_GraphicsDrawLine($hGraphics, $x1 + 200, $y1 + 200, $x2 + 200, $y2 + 200, $hPen) ; Grundlinie
    Dreieck($x1 + 200, $y1 + 200, $x2 + 200, $y2 + 200)
    Next

    [/autoit] [autoit][/autoit] [autoit]

    ;~ Quadrat($x1, $y1, $x2, $y2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg() <> -3
    WEnd
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _Punkt_gedreht_um_Winkel($Px, $Py, $alpha, $DPx, $DPy) ;Koordinaten Punkt, Winkel in Grad Drehrichtung nach RECHTS, Koordinaten Drehpunkt
    Local $Hx = $Px - $DPx
    Local $Hy = $Py - $DPy
    ;$degToRad = atan(1)*4 / 180 ;atan(1)*4=pi
    $degtorad = 0.0174532925
    $sinus = Sin(-$alpha * $degtorad)
    $cosinus = Cos(-$alpha * $degtorad)
    Local $a[2] ;array koordinaten
    $a[0] = $DPx + Round($Hx * $cosinus - $Hy * $sinus, 2) ;2 Nachkommastellen sollten reichen
    $a[1] = $DPy + Round($Hx * $sinus + $Hy * $cosinus, 2)
    Return $a
    EndFunc ;==>_Punkt_gedreht_um_Winkel

    [/autoit] [autoit][/autoit] [autoit]

    Func pyth_Dreieck($x1, $y1, $x2, $y2)
    Local $temp
    ;pythagöräische dreiecke haben die Seitenlänge 3,4 und 5 bzw vielfache davon, 3^2+4^2=5^2
    ;also ist der zu drehende punkt auf der Grundlinie 4/5tel von einem der Endpunkte entfernt
    ;$lg=sqrt(($x2-$x1)^2+($y2-$y1)^2) ;länge grundlinie

    [/autoit] [autoit][/autoit] [autoit]

    $px1 = 4 / 5 * ($x2 - $x1) + $x1 ;4/5 von P1 entfernt
    $py1 = 4 / 5 * ($y2 - $y1) + $y1

    [/autoit] [autoit][/autoit] [autoit]

    $px2 = 3 / 5 * ($x2 - $x1) + $x1 ;3/5 von P1 entfernt
    $py2 = 3 / 5 * ($y2 - $y1) + $y1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;es gibt 4 mögliche positionen für den 3. Punkt, lege 2 DIN A4 übereinander und falte sie diagonal (die diagonale ist die Grundlinie (Hypotenuse)
    ;dann falte sie wieder auseinander, nimm das obere Blatt und drehe es um, so dass du die unterseite siehst
    ;dann lege die 2 diagonalen Knicke übereinander und du siehst die 4 Ecken, die 90° haben^^
    ;die beiden Winkel zwischen den Katheten und der Hypotenuse sind immer 36.87° und 53.13° beim Pytagoräischen Dreieck

    [/autoit] [autoit][/autoit] [autoit]

    ;1. Punkt
    $temp = _Punkt_gedreht_um_Winkel($px1, $py1, 36.87, $x1, $y1) ; links
    _GDIPlus_GraphicsDrawLine($hGraphics, $x1, $y1, $temp[0], $temp[1])
    _GDIPlus_GraphicsDrawLine($hGraphics, $x2, $y2, $temp[0], $temp[1])

    [/autoit] [autoit][/autoit] [autoit]

    ;2. Punkt
    $temp = _Punkt_gedreht_um_Winkel($px1, $py1, -36.87, $x1, $y1) ; rechts
    _GDIPlus_GraphicsDrawLine($hGraphics, $x1, $y1, $temp[0], $temp[1])
    _GDIPlus_GraphicsDrawLine($hGraphics, $x2, $y2, $temp[0], $temp[1])

    [/autoit] [autoit][/autoit] [autoit]

    ;3. Punkt
    $temp = _Punkt_gedreht_um_Winkel($px2, $py2, 53.13, $x1, $y1) ; links
    _GDIPlus_GraphicsDrawLine($hGraphics, $x1, $y1, $temp[0], $temp[1])
    _GDIPlus_GraphicsDrawLine($hGraphics, $x2, $y2, $temp[0], $temp[1])

    [/autoit] [autoit][/autoit] [autoit]

    ;4. Punkt
    $temp = _Punkt_gedreht_um_Winkel($px2, $py2, -53.13, $x1, $y1) ; rechts
    _GDIPlus_GraphicsDrawLine($hGraphics, $x1, $y1, $temp[0], $temp[1])
    _GDIPlus_GraphicsDrawLine($hGraphics, $x2, $y2, $temp[0], $temp[1])
    EndFunc ;==>pyth_Dreieck

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;allerdings hat man ein rechtwinkliges Dreieck auch, wenn die Summe von alpha und beta gleich 90° sind!
    Func dreieck($x1, $y1, $x2, $y2) ;zufälliges rechtwinkliges Dreieck aufgrund einer strecke

    [/autoit] [autoit][/autoit] [autoit]

    $lg = Sqrt(($x2 - $x1) ^ 2 + ($y2 - $y1) ^ 2) ;Länge Hypotenuse

    [/autoit] [autoit][/autoit] [autoit]

    ;Kreisfunktion Y^2+X^2=1
    $cx = 0.8 * Random(-0.5, 0.5) ;zufälliger x-punkt auf dem Thaleskreis mit Radius 0.5, die 0.8 sind ein verkleinerungsfaktor, um das >Dreieck nur links von der linie zu haben
    $cy = Sqrt(0.25 - $cx ^ 2) ;pythagoras ergibt Länge Kathete_2 ==> rechtwinkliges Dreieck
    $cx = $x1 + ($x2 - $x1) / 2 + $cx * $lg ;x-und y-koordinate, nur der obere Teil des Thaleskreises
    $cy = $y1 + ($y2 - $y1) / 2 - $cy * $lg
    ;Punkt C aus den längen ermitteln

    [/autoit] [autoit][/autoit] [autoit]

    ;Punkt
    ;$temp = _Punkt_gedreht_um_Winkel($px1, $py1, 36.87, $x1, $y1) ; links
    _GDIPlus_GraphicsDrawLine($hGraphics, $x1, $y1, $cx, $cy)
    _GDIPlus_GraphicsDrawLine($hGraphics, $x2, $y2, $cx, $cy)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>dreieck

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;x1|y1 unten links
    ;x2|y2 Unten rechts
    Func Quadrat($x1, $y1, $x2, $y2)
    Local $temp, $temp2
    $temp = _Punkt_gedreht_um_Winkel($x1, $y1, 90 - 180, $x2, $y2)
    _GDIPlus_GraphicsDrawLine($hGraphics, $x2, $y2, $temp[0], $temp[1]); rechts

    [/autoit] [autoit][/autoit] [autoit]

    $temp2 = _Punkt_gedreht_um_Winkel($x2, $y2, 90, $x1, $y1)
    _GDIPlus_GraphicsDrawLine($hGraphics, $x1, $y1, $temp2[0], $temp2[1]); links

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawLine($hGraphics, $temp2[0], $temp2[1], $temp[0], $temp[1]);oben
    EndFunc ;==>Quadrat

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func Abstand($x1, $y1, $x2, $y2)
    Return Round(Sqrt(($x2 - $x1) ^ 2 + ($y2 - $y1) ^ 2), 2)
    EndFunc ;==>Abstand

    [/autoit]