Wellen wollen sich nicht so recht wellen
Verfasst: 02.06.2005 19:21
Ich hab mal auf gutglück ein wellenprogramm geschrieben, aber warum wellt es nur realistiscge wellen wen es so wenige Teilchen gibt?
Irgendwie bin ich nicht so wirklich zufriedenn damit...
Irgendwie bin ich nicht so wirklich zufriedenn damit...
Code: Alles auswählen
;seltsamerweise sind die wellen realistischer, je niedriger die Details...
InitSprite()
InitKeyboard()
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#detail
#Text_0
#Text_1
#Text_2
#Text_3
#start
#aend
#wellenlaenge
#gleich
#frame
EndEnumeration
Global detail.w
Global wasserspiegel.w
Global laenge.w
Global aend.w
Global x.w
Global warte.w
Global frame.b
frame=80
aend=20
laenge=40
wasserspiegel=200
detail=1000
Procedure Open_Window_0()
If OpenWindow(#Window_0, 290, 184, 600, 300, #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar , "Welleneinstellungen")
If CreateGadgetList(WindowID())
TrackBarGadget(#detail, 110, 230, 390, 30, 41, 2000)
TrackBarGadget(#aend, 110, 190, 390, 30, 0, 200)
TrackBarGadget(#wellenlaenge, 110, 150, 390, 30, 0, 300)
TrackBarGadget(#frame, 110, 110, 390, 30, 1, 127)
TextGadget(#Text_0, 10, 230, 100, 20, "Wasserdetails:"+Str(detail))
TextGadget(#Text_1, 10, 190, 100, 20, "Änderung:"+Str(aend))
TextGadget(#Text_2, 10, 150, 100, 20, "Wellenlänge:"+Str(laenge))
TextGadget(#Text_3, 10, 110, 110, 20, "Max FPS:" + Str(frame))
ButtonGadget(#start, 500, 220, 80, 40, "Start")
CheckBoxGadget(#gleich,10,70,180,20,"Wellenlänge=Änderung")
EndIf
EndIf
EndProcedure
Open_Window_0()
SetGadgetState(#detail,1000)
SetGadgetState(#aend,20)
SetGadgetState(#wellenlaenge,40)
SetGadgetState(#frame,frame)
1:
Repeat
Event = WaitWindowEvent()
If Event = #PB_EventGadget
GadgetID = EventGadgetID()
If GadgetID = #detail
detail=GetGadgetState(#detail)
SetGadgetText(#Text_0, "Wasserdetails:"+Str(detail))
ElseIf GadgetID = #aend
aend=GetGadgetState(#aend)
SetGadgetText(#Text_1, "Änderung:"+Str(aend))
If GetGadgetState(#gleich)=1
laenge=GetGadgetState(#wellenlaenge)
SetGadgetText(#Text_2, "Wellenlänge:"+Str(laenge))
SetGadgetState(#wellenlaenge,aend)
EndIf
ElseIf GadgetID = #wellenlaenge
laenge=GetGadgetState(#wellenlaenge)
SetGadgetText(#Text_2, "Wellenlänge:"+Str(laenge))
If GetGadgetState(#gleich)=1
aend=GetGadgetState(#aend)
SetGadgetText(#Text_1, "Änderung:"+Str(aend))
SetGadgetState(#aend,laenge)
EndIf
ElseIf GadgetID =#frame
frame=GetGadgetState(#frame)
SetGadgetText(#Text_3,"Max FPS:"+Str(frame))
ElseIf GadgetID = #start
aend=GetGadgetState(#aend)
laenge=GetGadgetState(#wellenlaenge)
detail=GetGadgetState(#detail)
Goto start
EndIf
EndIf
Until Event = #PB_EventCloseWindow
End
start:
Dim TeilchenX(detail+1)
Dim TeilchenY(detail+1)
TeilchenY(detail+1)=wasserspiegel+10
TeilchenY(0)=wasserspiegel-10
For x=0 To detail+1
TeilchenX(x)=Int(x*(1024/detail))
TeilchenY(x)=wasserspiegel
Next
TeilchenX(1)=0
OpenScreen(1024,768,32,"wasser")
SetFrameRate(frame)
Repeat
ClearScreen(10,10,150)
If warte=0
TeilchenY(detail-40)=wasserspiegel-aend
TeilchenY(detail-20)=wasserspiegel+aend
warte=laenge
EndIf
warte=warte-1
StartDrawing(ScreenOutput())
For x=1 To detail
;TeilchenY(x-1)=TeilchenY(x-1)+1
Plot(TeilchenX(x),TeilchenY(x),RGB(0,0,255))
If TeilchenY(x)>TeilchenY(x+1) Or TeilchenY(x)>TeilchenY(x-1); Ein Komma vor der Or ändert die wellenform
TeilchenY(x)=TeilchenY(x)-1
ElseIf TeilchenY(x)<TeilchenY(x+1) Or TeilchenY(x)<TeilchenY(x-1);dito
TeilchenY(x)=TeilchenY(x)+1
EndIf
;If TeilchenY(x) < Wasserspiegel ;Sieht nur bei niedrigen Details gut aus
; TeilchenY(x) = TeilchenY(x)+0.5
;ElseIf TeilchenY(x) > Wasserspiegel
; TeilchenY(x) = TeilchenY(x)-0.4
;EndIf
LineXY(TeilchenX(x), TeilchenY(x),TeilchenX(x+1), TeilchenY(x+1),RGB(0,0,255))
Next
DrawingMode(1)
FrontColor(0,0,0)
Locate(10,10)
DrawText("Warte:"+Str(warte))
StopDrawing()
FlipBuffers()
ExamineKeyboard()
Until KeyboardReleased(#pb_key_escape)
CloseScreen()
warte=0
Goto 1: