nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4648 Wohnort: ~/
|
Verfasst am: 30.12.2023, 22:23 Titel: Turtle-Grafik |
|
|
Da ich schon länger nichts Neues mehr gepostet habe, gibt es - passend zur dunklen Jahreszeit - einen recht simplen Sternenhimmel, angelehnt an eine Snap!-Programmieraufgabe, die ich neulich gestellt habe. Nun basiert Snap! aber auf Turtle-Grafik, die in FreeBASIC nicht nativ unterstützt wird (DRAW kann nur rechtwinklig arbeiten), daher habe ich zunächst eine Turtle-Grafik programmiert. Die Dokumentation ist sehr spärlich, die Befehle aber wahrscheinlich ziemlich selbsterklärend.
Turtle-Grafik und Sternenhimmel wurden jeweils innerhalb etwa einer Stunde programmiert, es kann also sein, dass ich irgendwo geschlampt habe. Rückmeldungen zu Fehlern werden dankend angenommen. Ansonsten darf die Turtle-Grafik, wenn sie jemand nützlich findet, gern frei verwendet werden.
turtle.bi
Code: | #pragma once
type TypTurtle
private:
as double x_ = 0, y_ = 0, winkel_ = 0, farbe_ = &hffffff
as boolean stiftUnten_ = false
public:
declare function x as integer
declare function y as integer
declare function winkel as double
declare function farbe as uinteger
declare function stiftUnten as boolean
declare sub bewegeZuX(wert as integer)
declare sub bewegeZuY(wert as integer)
declare sub bewegeRichtungX(wert as integer)
declare sub bewegeRichtungY(wert as integer)
declare sub bewege(wert as integer)
declare sub dreheZuWinkel(wert as double)
declare sub dreheLinks(wert as double)
declare sub dreheRechts(wert as double)
declare sub setzeFarbe(wert as uinteger)
declare sub setzeRot(wert as ubyte)
declare sub setzeGruen(wert as ubyte)
declare sub setzeBlau(wert as ubyte)
declare sub stiftHeben
declare sub stiftSenken
end type
' Abfrage der Koordinaten, Winkel, Farbeinstellung und Stiftposition
function TypTurtle.x as integer
return x_
end function
function TypTurtle.y as integer
return y_
end function
function TypTurtle.winkel as double
return winkel
end function
function TypTurtle.farbe as uinteger
return farbe_
end function
function TypTurtle.stiftUnten as boolean
return stiftUnten_
end function
' Bewegung zu einer bestimmten Position
sub TypTurtle.bewegeZuX(wert as integer)
if stiftUnten then pset(x, y), farbe
x_ = wert
if stiftUnten then line -(x, y), farbe
end sub
sub TypTurtle.bewegeZuY(wert as integer)
if stiftUnten then pset(x, y), farbe
y_ = wert
if stiftUnten then line -(x, y), farbe
end sub
' waagrechte bzw. senkrechte Bewegung
sub TypTurtle.bewegeRichtungX(wert as integer)
if stiftUnten then pset(x, y), farbe
x_ += wert
if stiftUnten then line -(x, y)
end sub
sub TypTurtle.bewegeRichtungY(wert as integer)
if stiftUnten then pset(x, y), farbe
y_ += wert
if stiftUnten then line -(x, y), farbe
end sub
' Bewegung in Abhaengigkeit zum aktuellen Winkel
sub TypTurtle.bewege(wert as integer)
dim as double winkelRad = acos(0)*winkel_/90
if stiftUnten then pset(x, y), farbe
x_ += cos(winkelRad)*wert
y_ += sin(winkelrad)*wert
if stiftUnten then line -(x, y), farbe
end sub
' Aenderung des Drehwinkels
sub TypTurtle.dreheZuWinkel(wert as double)
winkel_ = wert
do while winkel_ < 0
winkel_ += 360
loop
do while winkel_ >= 360
winkel_ -= 360
loop
end sub
sub TypTurtle.dreheLinks(wert as double)
winkel_ -= wert
do while winkel_ < 0
winkel_ += 360
loop
end sub
sub TypTurtle.dreheRechts(wert as double)
winkel_ += wert
do while winkel_ >= 360
winkel_ -= 360
loop
end sub
' Farbe bzw. einzelnen Farbkanal setzen
sub TypTurtle.setzeFarbe(wert as uinteger)
farbe_ = wert
end sub
sub TypTurtle.setzeRot(wert as ubyte)
farbe_ = (wert shl 16) + (farbe_ and &h00ffff)
end sub
sub TypTurtle.setzeGruen(wert as ubyte)
farbe_ = (wert shl 8) + (farbe_ and &hff00ff)
end sub
sub TypTurtle.setzeBlau(wert as ubyte)
farbe_ = wert + (farbe_ and &hffff00)
end sub
' Stiftposition aenderen
sub TypTurtle.stiftHeben
stiftUnten_ = false
end sub
sub TypTurtle.stiftSenken
stiftUnten_ = true
end sub |
Und hier als Anwendungsbeispiel der Sternenhimmel:
Code: | #include "turtle.bi"
sub zeichneStern(turtle as TypTurtle, zackenzahl as integer, groesse as integer)
dim as double innenwinkel = (zackenzahl-2)*180/zackenzahl
with turtle
dim as boolean stift = .stiftUnten
if not stift then .stiftSenken
for i as integer = 1 to zackenzahl
.bewege(groesse)
.dreheRechts(innenwinkel)
.bewege(groesse)
.dreheLinks(2*innenwinkel-180)
next
if not stift then .stiftHeben
end with
end sub
screenres 800, 600, 32
randomize
dim as TypTurtle turtle
dim as boolean gitter(38, 28)
turtle.setzeFarbe(rgb(255, 255, 0))
for i as integer = 1 to 150
dim as integer x, y
do
x = int(rnd*39)+1
y = int(rnd*29)+1
loop until not gitter(x, y)
gitter(x, y) = true
turtle.bewegeZuX(x*20 + rnd*3)
turtle.bewegeZuY(y*20 + rnd*3)
turtle.setzeRot(rnd*50+205)
turtle.setzeGruen(rnd*50+205)
zeichneStern(turtle, int(rnd*4)+5, rnd*3+2)
next
getkey |
_________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|