• Hallo miteinander.

    Nach langer Zeit gibts von mir auch mal wieder ein kleines AutoIt Skript.

    Die Bezier.au3 sowie ein Beispiel findet ihr auch im Anhang!

    Bezier.au3
    [autoit]


    ; #FUNCTION# ====================================================================================================================
    ; Name ..........: _GenerateBezier
    ; Description ...: Erstellt eine Bezier Kurve mit einer beliebigen Anzahl an Punkten
    ; Die Anzahl der Punkte ist immer $order + 1, möchte man also 5 Punkte verwenden, so muss $order = 4 sein!
    ; Syntax ........: _GenerateBezier($order, $srcPointsX, $srcPointsY, $fidelty)
    ; Parameters ....: $order - Die Anzahl der Punkte - 1
    ; $srcPointsX - Ein Array mit den X-Koordinaten der Punkte
    ; $srcPointsY - Ein Array mit den Y-Koordinaten der Punkte
    ; $fidelty - Die präzision der Berechnung (höherer Wert = genauere Berechnung)
    ; Return values .: 2-Dimensionaler Array | Die erste Dimension sind die Berechneten Punkte,
    ; Die zweite Dimension muss entweder 0 für X-Werte,
    ; oder 1 für Y-Werte sein
    ; Author ........: PrideRage
    ; ===============================================================================================================================
    Func _GenerateBezier($order, $srcPointsX, $srcPointsY, $fidelty)
    Local $counter = 0
    Local $numPts = $order + 1
    Local $return[$fidelty+1][2]

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

    For $i = 0 To 1 Step (1 / $fidelty)
    $x = 0
    $y = 0

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

    For $j = 0 To $numPts-1 Step 1
    $x += binominalCoefficient($order, $j) * ($i ^ $j) * ((1-$i) ^ ($order - $j)) * $srcPointsX[$j]
    $y += binominalCoefficient($order, $j) * ($i ^ $j) * ((1-$i) ^ ($order - $j)) * $srcPointsY[$j]
    Next

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

    $return[$counter][0] = $x
    $return[$counter][1] = $y
    $counter += 1
    Next

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

    return $return
    EndFunc

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

    ;====UTILS===

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

    Func binominalCoefficient($n, $k)
    return (factorial($n)) / (factorial($k) * factorial($n - $k))
    EndFunc

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

    Func factorial($var)
    $ret = 1
    For $i = 1 To $var Step 1
    $ret *= $i
    Next
    Return $ret
    EndFunc

    [/autoit]

    Ich präsentiere: Die Bezier UDF

    Mit dieser UDF könnt ihr eine Bezier Kurve mit beliebig vielen Punkten erstellen.
    Und das beste: Sie ist nicht abhängig von anderen APIs und benutzt auch keine #includes
    Ihr könnt also die Bezier Kurve mit GDI+, OpenGL oder was auch immer darstellen lassen.

    Die Vorbereitung: Natürlich muss man vorher noch einiges Einrichten, aber die Vorbereitung geht schnell und einfach.
    Folgendes braucht ihr: 2 Arrays, die die jeweiligen x- und y- Koordinaten repräsentieren.

    Beispiel:

    $arrayX[7] = [50, 100, 400, 700, 200, 250, 630]
    $arrayY[7] = [50, 600, 50, 500, 500, 120, 200]

    Dabei bildet das paar $arrayX[0] und $arrayY[0] einen 2 dimensionalen Punkt bei X=50 und Y=50
    $arrayX[1] und $arrayY[1] sind auch ein paar, die den Punkt bei X=100 und Y=600 repräsentieren, usw..

    Wenn wir die Punkte haben, können wir auch schon eine Bezier Kurve generieren.
    Aber vorher brauchen wir noch die sogenannte "Order" (auf deutsch etwa der "Grad")
    Die Zahl, die ihr für $order einsetzen müsst ist die Anzahl der Punkte-1
    Bei dem obrigen Beispiel sind es 7 Punkte, daher ist $order = 6

    Hier ist der Prototyp der Funktion:

    _GenerateBezier($order, $srcPointsX, $srcPointsY, $fidelty)

    $order, $srcPointsX und $srcPointsY haben wir ja schon, aber was ist $fidelty??
    Ganz einfach: $fidelty ist eine beliebige Zahl die Angibt, wie präzise die Bezier Kurve erstellt wird.
    Wenn wir für $fidelty 500 benutzen, so können wir 500 Punkte zeichnen, und erhalten eine Bezier Kurve.
    Nehmen wir aber 2000, erhalten wir eine schönere Bezier Kurve

    Und nun kommt der spaßige Teil: Bringen wir die Bezier Kurve doch mal auf den Bildschirm

    Dafür brauchen wir einen For-Loop und eine API mit der wir Zeichnen
    So gehts:

    [autoit]

    For $i = 0 To $fidelty - 1 Step 1
    Zeichne(X Wert = $bezierKurve[$i][0], Y Wert = $bezierKurve[$i][1]
    Next

    [/autoit]

    Wenn wir also als fidelty 500 nehmen, schreiben wir For $i = 0 To 499 Step 1
    nehmen wir für fidelty 2000, schreiben wir For $i = 0 To 1999 Step 1


    Wem das jetzt immernoch ein wenig spanisch vorkommt, für den hab ich noch ein Beispiel programmiert,
    welches eine Bezier Kurve mittels GDI+ darstellt.


    Ich hoffe der eine oder andere kanns gebrauchen.

    Freue mich über eure Meinungen :)

    Mfg. PrideRage