Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Turtle-Grafik

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 30.12.2023, 22:23    Titel: Turtle-Grafik Antworten mit Zitat

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. lächeln

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.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz