Sinus, Cosinus geschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
lukas
Beiträge: 10
Registriert: 28.02.2007 21:47

Sinus, Cosinus geschwindigkeit

Beitrag von lukas »

Hi,
wie einige von euch bereits wissen, bin ich neu hier und der folgende, ist mein erster, selbstgecodeter Code in PureBasic :mrgreen: .
Jetzt, da ich von DBPro anderes gewohnt bin, hätte ich allerdings schon eine Frage.
Ich habe mich etwas mit Sinus und Cosinus gespielt, und dabei ist das herausgekommen:

Code: Alles auswählen

InitSprite()
InitKeyboard()
OpenScreen(800,600,16,"bla")

Global x.w
Global y.w
Global xrad.w = 150
Global yrad.w = 150
Global tend.w = 1
Global a.f



Repeat
 StartDrawing(ScreenOutput())
  FrontColor(RGB(255,255,255))
  x=400+Sin(a)*xrad
  y=300+Cos(a)*yrad
   Plot(x,y)
  a=a+5
   xrad=xrad+tend
   yrad=yrad+tend
  If xrad < 1 Or xrad > 200 
   tend = tend*-1
  EndIf
  
 StopDrawing()
  FlipBuffers()
 ExamineKeyboard()
Until KeyboardPushed(1) 
Allerdings geht das Punktesetzen vergleichsweise mit DBPro etwas
langsam. Kann man da was ändern, oder ist das so.
Und, die Punkte sind anfangs etwas weit auseinander. Wie kann ich das ändern.
mfg
Lukas
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

1.
das punktsetzen ist nicht langsam.
die tatsache, dass du pro frame nur 1 punk plottest, ist langsam.

hier mal ein beispiel, wo zuerst 10.000 punkte gezeichnet und dann angezeigt werden.

Code: Alles auswählen

InitSprite() 
InitKeyboard() 
OpenScreen(800,600,16,"bla") 

Global x.w 
Global y.w 
Global xrad.w = 150 
Global yrad.w = 150 
Global tend.w = 1 
Global a.f 

 StartDrawing(ScreenOutput()) 
  FrontColor(RGB(255,255,255)) 
For n = 0 To 10000
  x=400+Sin(a)*xrad 
  y=300+Cos(a)*yrad 
   Plot(x,y) 
  a=a+5 
   xrad=xrad+tend 
   yrad=yrad+tend 
  If xrad < 1 Or xrad > 200 
   tend = tend*-1 
  EndIf
Next
 StopDrawing() 
  FlipBuffers() 

Repeat 
 ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) 

2.
die punkte sind nicht anfangs etwas weit auseinander,
du plottest sie stets gleich weit auseinander, es werden lediglich später die lücken gefüllt.

der abstand deiner punkte ist ja auch krass.
du berechnest a=a+5, das entspricht 286°
Zuletzt geändert von Kaeru Gaman am 03.03.2007 20:49, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
lukas
Beiträge: 10
Registriert: 28.02.2007 21:47

Beitrag von lukas »

Thx für die Antwort
die punkte sind nicht anfangs etwas weit auseinander,
du plottest sie stets gleich weit auseinander, es werden lediglich später die lücken gefüllt.
Ja, drum ist es ja auch nur am Anfang so. Aber, was kann man dagegen machen. Ich habe schon etwas mit den Parametern gespielt, bin aber zu keinem brauchbaren Ergebnis gekommen.

edit: Oh, du hast editiert :)

Ich bin das StardDrawing() und StopDrawing einfach nicht gewohnt. Aber ich hoffe das kommt noch.
Zuletzt geändert von lukas am 03.03.2007 20:53, insgesamt 1-mal geändert.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

hab grad oben editiert.

du berechnest a=a+5, nimmst direkt Sin(a), d.h. du erhöhst bei jedem schritt um 286 grad.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
lukas
Beiträge: 10
Registriert: 28.02.2007 21:47

Beitrag von lukas »

Jo, habs bemerkt (siehe mein edit) :) .
Beim coden ist mir noch aufgefallen, dass ich um "a" zu erhöhen "a=a+1" schreiben musste. Bei DB gibt es dafür auch den Befehl "inc". Ich kann also in DB "inc a, 5" schreiben. Gibt es in Purebasic einen vergleichbaren Befehl?
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

einfach "a+5"
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

inc gibt es nicht, aber du kannst "a+5" schreiben.

ich hab nochmal an deinem code rumgespielt.

hab jetzt die umrechnung in radiant drin, also jetzt geht er wirklich bei jedem schritt um 1 grad hoch.
außerdem hab ich einen counter und ein MAXimum für den counter für deine radienänderung eingebaut.
vorher hattest du in jedem durchlauf dein xrad um tend erhöht,
nun zählt er erst den counter bis max, bevor er den radius ändert.

PS:
lol... hab ich vergessen, den code zu posten?
na, zu spät, ich habs jetzt mal in ein fensterle gepackt.
jetzt kannst du sehen, wie schnell er wirklich plotten kann.
außerdem hab ich das Global-zeugst durch Define ersetzt.

Code: Alles auswählen

OpenWindow(0,0,0,500,500,"Spielerei")
Define x.w 
Define y.w 
Define xrad.w = 150 
Define yrad.w = 150 
Define tend.w = 1 
Define a.f 
Define MAX.w = 10
Define Rad.f
Define Ev.l
StartDrawing(WindowOutput(0)) 
  Box(0,0,500,500,$000000)
StopDrawing() 
Repeat
 Ev = WindowEvent()
 StartDrawing(WindowOutput(0)) 
  Rad = a*#PI/180
  x=250+Sin(Rad)*xrad 
  y=250+Cos(Rad)*yrad 
   Plot(x,y,$FFFFFF) 
  a + 1
  counter + 1
  If counter > MAX 
  counter = 0
     xrad=xrad+tend 
     yrad=yrad+tend 
    If xrad < 1 Or xrad > 200 
     tend = -tend 
    EndIf
  EndIf 
 StopDrawing()
Until Ev = #PB_Event_CloseWindow
PPS:
besser beim plotten zugucken kannst du, wenn du ihn in jedem durchlauf 1 ms warten läßt:
ersetze eine zeile:

Code: Alles auswählen

 Ev = WaitWindowEvent(1)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

angenehmes tempo bekommt es, wenn man pro fensterdurchlauf 10 rechendurchläufe macht.
ein paar andere werte noch angepasst, und so siehts schick aus:

Code: Alles auswählen

OpenWindow(0,0,0,500,500,"Spielerei")
Define x.w 
Define y.w 
Define xrad.w = 200 
Define yrad.w = 200 
Define tend.w = 1 
Define a.f 
Define MAX.w = 2
Define Rad.f
Define Ev.l
StartDrawing(WindowOutput(0)) 
  Box(0,0,500,500,$000000)
StopDrawing() 
Repeat
 Ev = WaitWindowEvent(1)
 StartDrawing(WindowOutput(0)) 
For n=0 To 9
  Rad = a*#PI/180
  x=250+Sin(Rad)*xrad 
  y=250+Cos(Rad)*yrad 
   Plot(x,y,$FFFFFF) 
  a + 0.5
  counter + 1
  If counter > MAX 
  counter = 0
     xrad=xrad+tend 
     yrad=yrad+tend 
    If xrad < 1 Or xrad > 200 
     tend = -tend 
    EndIf
  EndIf
 Next 
 StopDrawing()
Until Ev = #PB_Event_CloseWindow
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
lukas
Beiträge: 10
Registriert: 28.02.2007 21:47

Beitrag von lukas »

WOW! Genau so wollte ichs. Die Geschwindigkeiten, die man mit StartDrawing() und StopDrawing() erreichen kann sind fantastisch.
Christian H
Beiträge: 134
Registriert: 18.10.2005 10:22
Wohnort: Welschbillig

Beitrag von Christian H »

Habe mal ein wenig damit rum gespielt :-)

Code: Alles auswählen

Define x.w
Define y.w
Define xrad.w = 200
Define yrad.w = 200

Define oldxMouse.w = 200
Define oldyMouse.w = 200
Define newxMouse.w = 200
Define newyMouse.w = 200

Define tend.w = 1
Define a.f
Define MAX.w = 2
Define Rad.f
Define Ev.l
Define Cls.b


OpenWindow(0,0,0,800,800,"Spielerei")

CreateGadgetList(WindowID(0))
      TextGadget(0, 10, 6, 50 , 20, "0/0",#PB_Text_Border )

StartDrawing(WindowOutput(0))
  Box(0,0,800,800,$000000)
StopDrawing()
Repeat
 Ev = WaitWindowEvent(1)
  
 newxMouse = WindowMouseX(0)
 newyMouse = WindowMouseY(0)
 Cls=0
 If newxMouse > oldxMouse+10 Or newxMouse < oldxMouse-10
    oldxMouse = newxMouse
    xrad      = oldxMouse/2
    Cls       = 1
 EndIf
 
 If newyMouse > oldyMouse+10 Or newyMouse < oldyMouse-10
    oldyMouse = newyMouse
    yrad      = oldyMouse/2
    Cls       = 1
 EndIf
 
 SetGadgetText(0," " + Str(oldxMouse/2) + "/" + Str(oldyMouse/2))
  
 StartDrawing(WindowOutput(0)) 
   
 If Cls = 1
    Box(0,0,800,800,$000000)
 EndIf

For n=0 To 9
  Rad = a*#PI/180
  x=400+Sin(Rad)*xrad
  y=400+Cos(Rad)*yrad
   Plot(x,y,$FFFFFF)
  a + 0.5
  counter + 1
  If counter > MAX
  counter = 0
     xrad=xrad+tend
     yrad=yrad+tend
    If xrad < 1 Or xrad > 400
     tend = -tend
    EndIf
  EndIf
 Next
 
 StopDrawing()
Until Ev = #PB_Event_CloseWindow
Gruß Christian
Antworten