Tutorial
Arbeiten mit Grafik-Befehlen
von ytwinky | Seite 6 von 7 |
Jeder Vermesser weiß, was jetzt kommt:
Die Umwandlung polarer Kordinaten(Winkel und Strecke) in rechtwinklige Koordinaten(x und y)
Die Formeln aus dem Vermessungshandbuch helfen hier jedoch wenig, da dort die Bezugsrichtung Nord(also 'oben')ist und in unserem Fall West(also 'rechts'). Da im Vermessungswesen ja sowieso x und y vertauscht sind, hilft alles nichts:Selber denken..
Dazu benötigen wir eine Strecke s=Radius/2.0 und einen Winkel w=(Endwinkel-Anfangswinkel)/2.0
Wenn wir w zum AnfangsWinkel addieren, sollten wir eigentlich hinkommen..
Die Koordinatendifferenzen erhalten wir per s*Cos(w) bzw. s*Sin(w). Das müssen wir nur noch richtig zu den Koordinaten von P3 addieren und der Fall ist erledigt. Was P3 ist noch nicht definiert? Nachholen..
P3.y=200
P3.x=200
Circle (P3.x, P3.y), Radius, Gruen, -AnfangsWinkel, -EndWinkel
s=Radius/2.0
w=AnfangsWinkel+(EndWinkel-AnfangsWinkel)/2.0
Circle(P3.x+s*Cos(w), P3.y-s*Sin(w)), 3, Rot 'der Kontrollpunkt soll nur zeigen, daß wir auch wirklich im Segment gelandet sind^^
Circle(P3.x, P3.y), Radius, Rot, -AnfangsWinkel, -EndWinkel
Paint(240, 160), Gruen, Rot 'und mit Rahmen versehen
[Exkurs]
Oh Mann, Mathematik..
Geht Grafik auch ohne Mathematik? Nun Radio Eriwan würde antworten: Im Prinzip ja..
Diese Betrachtungen gelten alle nur für den zweidimensionalen Raum, wer hier schon die Waffen streckt, hätte Schwierigkeiten bei weiterführenden 2D-Grafik-Tutorials, von 3D-Grafiken mal ganz abgesehen. Mathematik stört beim Programmieren nie, im Gegentum, sie hilft ungemein..
Nehmen wir z.B. die Punkte P1 und P2: Wie weit sind sie voneinander entfernt? Wo ist denn jetzt mein Geo-Dreieck..
..nicht gefunden, aber wozu habe ich FreeBASIC?
Declare Function Strecke(DeltaY As Double, DeltaX As Double) As Double
Function Strecke(DeltaY As Double, DeltaX As Double) As Double
Return Sqr(DeltaY*DeltaY+DeltaX*DeltaX)
End Function
?"Strecke von P1 nach P2=" &Strecke(P1.y-P2.y, P1.x-P2.x)
..rledigt..
Sollte in der Funktion nicht noch eine Fehlerprüfung sein, denn aus einer negativen Zahl kann ja keine Wurzel gezogen werden? Richtiger und wichtiger Einwand, ist aber hier unnötig, da wir ja mit DeltaY*DeltaY das Quadrat einer Zahl verwenden. Zu diesem Quadrat addieren wir noch ein weiteres Quadrat und diese Summe kan nicht negativ sein, wir brauchen hier keine Fehlerprüfung.
Wieso ich die umständliche Form 'DeltaY*DeltaY' gewählt habe und nicht DeltaY^2? Das ist ganz einfach:der '^'-Operator ist sehr Rechenzeit-intensiv, deshalb sollte er nur dort, wo es unbedingt nötig ist, benutzt werden. Ein anderer Befehl aus dieser Kategorie ist Mid(). Beides sind unglaublich leistungsfähige Befehle, aber genauso unglaublich ist auch ihre Prozessorbelastung..
Gerade bei den Grafik-Befehlen, die häufig in Schleifen benötigt werden, gilt es, möglichst einfache Befehle zu benutzen und einfache Datentypen. Ich höre sie schon rufen:"Du benutzt doch selber auch Doubles!". Ja, das läßt sich nicht umgehen, denn Sin() und Cos() liefern nunmal Double-Werte(btw: genauso wie Timer!!)
[/Exkurs]
Kreise können wir füllen, Kreissegmente auch. Was fehlt noch? Ach richtig, falls wir mal ein Wahlauswertungsprogramm schreiben wollen, brauchen wir nicht nur Tortendiagramme für die Sitzverteilung, sondern auch Balkendiagramme(gaaanz wichtig :D).
Die können wir noch nicht? Weit gefehlt(oder nicht genug in der Befehlsreferenz gelesen)..
Das geht mit dem Line-Befehl *zeitlasszumnachkuckeninderreferenz*
Mit
Line (P1.x, P1.y)-(P2.x, P2.y), Rot, B
würde ein Rechteck gezeichnet werden und mit
Line (P1.x, P1.y)-(P2.x, P2.y), Rot, BF
ein ausgefülltes Rechteck.
Zusätzliche Informationen und Funktionen | |||||||
---|---|---|---|---|---|---|---|
|