Sterne, n-Ecke und anderes

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Chrise

Betreff: Sterne, n-Ecke und anderes

BeitragSo, Jul 27, 2008 13:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!

Ich weiß nicht, ob es sich schon lohnt, hier reinzustellen, aber ich machs jetzt einfach mal ^^
Gestern war mir ein wenig langweilig und dann hab etwas kleines programmiert, dass vielleicht bei manchen nützlich sein könnte, die ein kleines 2D Projekt starten.

Leider ist die Performance bei großer Menge nicht mehr so perfekt, wie sie sein könnte, aber das liegt einfach an dem häufigen Line-befehl, der verwendet wird:

Hier sind die Grundbefehle:

Zeichnet Rechteck, das sich beliebig drehen lässt. ( Wenig nützlich xD)
RectTurn(x-Koordinate,y-Koordinate,Breite,Länge,[Winkel],[Rotanteil],[Grünanteil],[Blauanteil])

Zeichnet Stern mit einer beliebigen Anzahl von Ecken:
Star(x-Koordinate,y-Koordinate,Sterngröße,Spitzengröße (je näher der Wert an dem Wert der Größe liegt, desto kleiner die Spitzen,Spitzenzahl,[Winkel],[Streckung in Y-Richtung],[Rotanteil],[Grünanteil],[Blauanteil])

Zeichnet eine Sonne:
Sun(x-Koordinate,y-Koordinate,Strahlenlänge,Strahlenanzahl,[Winkel],[rauschende Strahlen],[Streckung],[Rotanteil],[Grünanteil],[Blauanteil])

Zeichnet Pentragramm oder andere Gramme:
Pentagramm(x-Koordinate,y-Koordinate,Größe,Spitzenzahl (Achtung! Bei bestimmten Werten tritt wegen mathematischer Regeln fehler auf z.b. 11-Eck nicht möglich),[Winkel],[Streckung],[Rotanteil],[Grünanteil],[Blauanteil])

Zeichnet beliebiges n-Eck:
n_Eck(x-Koordinate,y-Koordinate,Größe,Eckenzahl,[Winkel],[Streckung],[Rotanteil],[Grünanteil],[Blauanteil])

Zeichnet Spirale (Achtung: Ziemlich schlechte Performance bei hohen Größen- oder Längenwerten.:
Spirale(x-Koordinate,y-Koordinate,Größe,Steps (In Wieviele Winkel eine Umrundung aufgeteilt wird.),Länge der Spriale,[Winkel],[Logarithmisch oder nicht (1 nicht logartihmisch. >1 Logarithmisch z.b. 1.01)],[Streckung],[Rotanteil],[Grünanteil],[Blauanteil])


Beispiel-programm:
Code: [AUSKLAPPEN]

Graphics 400,300,0,2
SetBuffer BackBuffer()

wert=0

Include "DrawSymbol_lib.bb"

While Not KeyHit(1)
   Cls
   
   w=w+1
   Sinus=sinus+1
   
   If wert=0 Then
   Sun(50,50,50,30,w,0)
   Sun(150,50,Sin(sinus)*50,30,2*w,0)
   Star(250,50,50,30,10,w)
   Star(350,50,50,17,5,w*3)
   
   Pentagramm(50,150,50,5,-w)
   n_Eck(150,150,50,3,w)
   n_Eck(250,150,50,5,-2*w)
   Star(350,150,50,10,8,w*3)
   
   Else If wert=1 Then
   Spirale(200,150,1,30,150,w,1.01)
   EndIf
   
   ;FPS
   FPSZahl=FPSZahl+1
   If MilliSecs()-timer >= 1000 Then
   timer = MilliSecs()
   FPS=FPSZahl
   FPSZahl=0
   EndIf
   Text 50,250,"FPS: "+FPS
   ;/FPS
   
   If KeyHit(57) Then wert=1-wert
   Text 50,265,"Mit Leertaste den Modus umschalten"
   
   Flip
Wend
End


User Lib:
Code: [AUSKLAPPEN]

Function RectTurn(x,y,b,l,g#=0,f=0,red=255,green=255,blue=255)
   Color red,green,blue
   Line x,y,Cos(g#)*b+x,Sin(g#)*b+y
   Line x,y,Cos(g#+90)*l+x,Sin(g#+90)*l+y
   Line Cos(g#+90)*l+x,Sin(g#+90)*l+y,Cos(g#)*b+(Cos(g#+90)*l+x),Sin(g#)*b+(Sin(g#+90)*l+y)
   Line Cos(g#)*b+x,Sin(g#)*b+y,Cos(g#)*b+(Cos(g#+90)*l+x),Sin(g#)*b+(Sin(g#+90)*l+y)
End Function

Function Star(x,y,l,l2,a,g#=0,s#=1,red=255,green=255,blue=255)
   Color red,green,blue
   Local amount#=(360/a),amount2#=(180/a),zufall#
   For i=0 To a
   Line l2*Cos(g#+amount#*i+amount2#)+x,(l2*Sin(g#+amount#*i+amount2#)*s)+y,l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i)*s)+y
   Line l2*Cos(g#+amount#*i-amount2#)+x,(l2*Sin(g#+amount#*i-amount2#)*s)+y,l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i)*s)+y
   Next
End Function

Function Sun(x,y,l,a,g#=0,z=0,s#=1,red=255,green=255,blue=255)
   Color red,green,blue
   Local amount#=(360/a),zufall#
   For i=0 To a
   If z>0 Then zufall#=Rnd(z)
   Line x,y,(l+Rnd(z))*Cos(g#+amount#*i)+x,((l+Rnd(z))*Sin(g#+amount#*i)*s)+y
   Next
End Function

Function Pentagramm(x,y,l,a,g#=0,s#=1,red=255,green=255,blue=255)
   Color red,green,blue
   Local amount#=(360/a)
   For i=0 To a
   Line l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i)*s)+y,l*Cos(g#+amount#*(i+2))+x,(l*Sin(g#+amount#*(i+2))*s)+y
   Next
End Function

Function n_Eck(x,y,l,a,g#=0,s#=1,red=255,green=255,blue=255)
   Color red,green,blue
   Local amount#=(360/a)
   For i=0 To a
   Line l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i))*s+y,l*Cos(g#+amount#*(i+1))+x,(l*Sin(g#+amount#*(i+1)))*s+y
   Next
End Function

Function Spirale(x,y,l#,st#=1,a,g#=0,Logr#=0,s#=1,red=255,green=255,blue=255)
   Color red,green,blue
   Local amount#=(360/st#),l2#=0
   For i=0 To a
   If Logr=0 Then l2#=l2#+l#
   If Logr<>0 Then l#=l#*logr l2#=l2#+l#
   Line (l2-l)*Cos(g#+amount#*i)+x,((l2-l)*Sin(g#+amount#*i))*s+y,l2*Cos(g#+amount#*(i+1))+x,(l2*Sin(g#+amount#*(i+1)))*s+y
   Next
End Function
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Smily

BeitragMo, Jul 28, 2008 9:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Hoi,

Ich habe das nicht getestet, da ich hier kein BB habe, aber ein kleiner Tip von mir:

Du solltest das ganze ohne die Parameter Rot-Anteil, Grün-Anteil und Blau-Anteil machen und einfach in der gerade eingestellten Farbe zeichnen.

cu,
Smily0412
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org

Chrise

BeitragMo, Jul 28, 2008 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Smily0412 hat Folgendes geschrieben:
Hoi,

Ich habe das nicht getestet, da ich hier kein BB habe, aber ein kleiner Tip von mir:

Du solltest das ganze ohne die Parameter Rot-Anteil, Grün-Anteil und Blau-Anteil machen und einfach in der gerade eingestellten Farbe zeichnen.

cu,
Smily0412

huhu^^
Stimmt... daran hatte ich gestern schonmal gedacht. Ich werds mal raustun ^^

Code: [AUSKLAPPEN]

Graphics 400,300,0,2
SetBuffer BackBuffer()

wert=0

While Not KeyHit(1)
   Cls
   
   w=w+1
   Sinus=sinus+1
   
   If wert=0 Then
   Sun(50,50,50,30,w,0)
   Sun(150,50,Sin(sinus)*50,30,2*w,0)
   Star(250,50,50,30,10,w)
   Star(350,50,50,17,5,w*3)
   
   Pentagramm(50,150,50,5,-w)
   n_Eck(150,150,50,3,w)
   n_Eck(250,150,50,5,-2*w)
   Star(350,150,50,10,8,w*3)
   
   Else If wert=1 Then
   Spirale(200,150,1,30,150,w,1.01)
   EndIf
   
   ;FPS
   FPSZahl=FPSZahl+1
   If MilliSecs()-timer >= 1000 Then
   timer = MilliSecs()
   FPS=FPSZahl
   FPSZahl=0
   EndIf
   Text 50,250,"FPS: "+FPS
   ;/FPS
   
   If KeyHit(57) Then wert=1-wert
   Text 50,265,"Mit Leertaste den Modus umschalten"
   
   Flip
Wend
End


Function RectTurn(x,y,b,l,g#=0,f=0)
   Line x,y,Cos(g#)*b+x,Sin(g#)*b+y
   Line x,y,Cos(g#+90)*l+x,Sin(g#+90)*l+y
   Line Cos(g#+90)*l+x,Sin(g#+90)*l+y,Cos(g#)*b+(Cos(g#+90)*l+x),Sin(g#)*b+(Sin(g#+90)*l+y)
   Line Cos(g#)*b+x,Sin(g#)*b+y,Cos(g#)*b+(Cos(g#+90)*l+x),Sin(g#)*b+(Sin(g#+90)*l+y)
End Function

Function Star(x,y,l,l2,a,g#=0,s#=1)
   Local amount#=(360/a),amount2#=(180/a),zufall#
   For i=0 To a
   Line l2*Cos(g#+amount#*i+amount2#)+x,(l2*Sin(g#+amount#*i+amount2#)*s)+y,l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i)*s)+y
   Line l2*Cos(g#+amount#*i-amount2#)+x,(l2*Sin(g#+amount#*i-amount2#)*s)+y,l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i)*s)+y
   Next
End Function

Function Sun(x,y,l,a,g#=0,z=0,s#=1)
   Local amount#=(360/a),zufall#
   For i=0 To a
   If z>0 Then zufall#=Rnd(z)
   Line x,y,(l+Rnd(z))*Cos(g#+amount#*i)+x,((l+Rnd(z))*Sin(g#+amount#*i)*s)+y
   Next
End Function

Function Pentagramm(x,y,l,a,g#=0,s#=1)
   Local amount#=(360/a)
   For i=0 To a
   Line l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i)*s)+y,l*Cos(g#+amount#*(i+2))+x,(l*Sin(g#+amount#*(i+2))*s)+y
   Next
End Function

Function n_Eck(x,y,l,a,g#=0,s#=1)
   Local amount#=(360/a)
   For i=0 To a
   Line l*Cos(g#+amount#*i)+x,(l*Sin(g#+amount#*i))*s+y,l*Cos(g#+amount#*(i+1))+x,(l*Sin(g#+amount#*(i+1)))*s+y
   Next
End Function

Function Spirale(x,y,l#,st#=1,a,g#=0,Logr#=0,s#=1)
   Local amount#=(360/st#),l2#=0
   For i=0 To a
   If Logr=0 Then l2#=l2#+l#
   If Logr<>0 Then l#=l#*logr l2#=l2#+l#
   Line (l2-l)*Cos(g#+amount#*i)+x,((l2-l)*Sin(g#+amount#*i))*s+y,l2*Cos(g#+amount#*(i+1))+x,(l2*Sin(g#+amount#*(i+1)))*s+y
   Next
End Function
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Triton

BeitragMo, Jul 28, 2008 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Es wundert mich, dass das 11er-gramm nicht funktioniert (und diverse andere auch nicht). Da stehen keine "mathematischen Gesetze" gegen Smile

Du hast nur was falsch gecodet.

Solche n-Gramme funktionieren doch bei Polygonen mit ungerader Eckenanzahl so, dass man irgendwo anfängt und den aktuellen Punkt mit dem jeweils übernächsten verbindet und zum Schluss wieder am Anfang ankommt.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Chrise

BeitragDi, Jul 29, 2008 8:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Triton hat Folgendes geschrieben:
Es wundert mich, dass das 11er-gramm nicht funktioniert (und diverse andere auch nicht). Da stehen keine "mathematischen Gesetze" gegen Smile

Du hast nur was falsch gecodet.

Solche n-Gramme funktionieren doch bei Polygonen mit ungerader Eckenanzahl so, dass man irgendwo anfängt und den aktuellen Punkt mit dem jeweils übernächsten verbindet und zum Schluss wieder am Anfang ankommt.


Nein, die ganz normalen n-Ecke funktionieren einwandfrei.
Die rede war von diesen Grammen, also wie z.b. Pentagramm. Die gehen mathematisch wegen ihrer Eckenzahl nicht auf. Das ist auch so, dass man die auf Blatt Papier nicht konstruieren könnte. Das hat irgendwas mit den Winkeln zu tun, soweit ich mich noch an den Mathe Unterricht erinnere ^^
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Silver_Knee

BeitragDi, Jul 29, 2008 10:17
Antworten mit Zitat
Benutzer-Profile anzeigen
user posted image

FAIL!

Tatsächlich funtz das nur nicht bei geraden zahlen , da werden allerdings trotzdem dinge kreiert, wie 3 Ecke Quadrate etc.

Hab das vor ewigkeiten im Zug "Converter Winamp AVS->BB" als Testcode gewählt. [Wundere dich nicht über den abstrakten codeaufbau]

Code: [AUSKLAPPEN]
Graphics 512,512,32,2
Local e#,n#,a#,t#,x#,y#
SetBuffer BackBuffer()
Origin 256,256
;int
e=7
Repeat
   ;frame
   n=e+1;
   a=0;
   t=1

   If MouseHit(1)
      ;beat
      e=(Rand(8)+1)*2+3
   EndIf
   
   ;point   
   i#=0
   
   fn_start#=0
   fn_end#=1
   i=fn_start
   fn_step#=1.0/n
   While i<fn_end
      x=-Cos(180/2+a*180/(e/2))*t
      y=-Sin(180/2+a*180/(e/2))*t
      a=a+Floor(e/2)
      
      i=i+fn_step
      
      If i<>0
         Line ox#*256,oy#*256,x*256,y*256
      EndIf
      ox#=x
      oy#=y
   Wend
   Flip
   Cls
Forever

Chrise

BeitragMi, Jul 30, 2008 14:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Hui, nicht schlecht ^^
Dann hab ich mal wieder was dazugelernt.
Llama 1 Llama 2 Llama 3
Vielen Dank an Pummelie, der mir auf seinem Server einen Platz für LlamaNet bietet.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group