Microsoft Small Basic

Program Listing: SHM062
tekenfrequentie=25
halveveldlengte=200
veldbreedte=200
nethoogte=40
balgrootte=2
g=9.8
richting=1
schaal=1
angleH=0.5
angleV=0.5
dx=300
dy=300

'hoeken van het veld
p[1]["x"]=-halveveldlengte
p[1]["y"]=-veldbreedte/2
p[1]["z"]=0
p[2]["x"]=halveveldlengte
p[2]["y"]=-veldbreedte/2
p[2]["z"]=0
p[3]["x"]=-halveveldlengte
p[3]["y"]=veldbreedte/2
p[3]["z"]=0
p[4]["x"]=halveveldlengte
p[4]["y"]=veldbreedte/2
p[4]["z"]=0
'hoeken van het net
p[5]["x"]=0
p[5]["y"]=-veldbreedte/2
p[5]["z"]=0
p[6]["x"]=0
p[6]["y"]=veldbreedte/2
p[6]["z"]=0
p[7]["x"]=0
p[7]["y"]=-veldbreedte/2
p[7]["z"]=nethoogte
p[8]["x"]=0
p[8]["y"]=veldbreedte/2
p[8]["z"]=nethoogte

dx=200
dy=200


BerekenSchermcoordinaten()
TekenSpeelVeld()
TekenNet()


'waar vertrekt de bal
'(we nemen x1 en y1 ipv x0 en y0, omdat deze in kiesbalsnelheden() doorgeschoven worden
'naar x0 en y0)
x1=-math.GetRandomNumber(halveveldlengte)
y1=math.GetRandomNumber(veldbreedte)-veldbreedte/2

GraphicsWindow.KeyDown=OnKeyDown

KiesBalSnelheden()

Timer.Tick=onTick
Timer.Interval=1000/tekenfrequentie



Sub OnKeyDown
If GraphicsWindow.LastKey="Left" then
angleH=angleH-0.1
elseIf GraphicsWindow.LastKey="Right" then
angleH=angleH+.1
elseIf GraphicsWindow.LastKey="Up" then
angleV=angleV-0.1
elseIf GraphicsWindow.LastKey="Down" then
angleV=angleV+0.1
endif
BerekenSchermcoordinaten()
endsub


Sub BerekenBal
teller=9

' draai in horizontale richting
'x' = x*cos q - y*sin q
p[teller]["xn"]=p[teller]["x"]*math.cos(angleH)-p[teller]["y"]*math.sin(angleH)
'y' = x*sin q + y*cos q
p[teller]["yn"]=p[teller]["x"]*math.sin(angleH)+p[teller]["y"]*math.cos(angleH)

'z' = z
p[teller]["zn"]=p[teller]["z"]

' draai in verticale richting

'y' = x*cos q - y*sin q
p[teller]["yn"]=p[teller]["yn"]*math.cos(angleV)-p[teller]["zn"]*math.sin(angleV)
'z' = x*sin q + y*cos q
p[teller]["zn"]=p[teller]["yn"]*math.sin(angleV)+p[teller]["zn"]*math.cos(angleV)

'x' = x
p[teller]["xn"]=p[teller]["xn"]

endsub

Sub BerekenSchermcoordinaten
For teller=1 To 8

' draai in horizontale richting
'x' = x*cos q - y*sin q
p[teller]["xq"]=p[teller]["x"]*math.cos(angleH)-p[teller]["y"]*math.sin(angleH)
'y' = x*sin q + y*cos q
p[teller]["yq"]=p[teller]["x"]*math.sin(angleH)+p[teller]["y"]*math.cos(angleH)

'z' = z
p[teller]["zq"]=p[teller]["z"]

' draai in verticale richting

'y' = x*cos q - y*sin q
p[teller]["yn"]=p[teller]["yq"]*math.cos(angleV)-p[teller]["zq"]*math.sin(angleV)
'z' = x*sin q + y*cos q
p[teller]["zn"]=p[teller]["yq"]*math.sin(angleV)+p[teller]["zq"]*math.cos(angleV)

'x' = x
p[teller]["xn"]=p[teller]["xq"]
endfor

endsub



Sub onTick
GraphicsWindow.Clear()
t=t+2/tekenfrequentie
If zt<0 then
If richting=-1 Then
richting=1
Else
richting=-1
endif
KiesBalSnelheden()
endif


TekenSpeelVeld()
TekenNet()
TekenBal()
'GraphicsWindow.DrawBoundText(10,10,1000,math.Round(xt)+" = "+math.Round(yt)+" = "+math.Round(zt)+" = "+math.Round(vx))

endsub

Sub KiesBalSnelheden
t=0
'waar vertrekt de bal
x0=x1
y0=y1


'waar komt de bal neer
x1=richting*math.GetRandomNumber(halveveldlengte)
y1=math.GetRandomNumber(veldbreedte)-veldbreedte/2

'kies een maxhoogte voor de bal (hoger dan het net)
hmax=nethoogte+math.GetRandomNumber(20)/5

'bereken hoe lang de bal in de lucht blijft
th=Math.SquareRoot(2*hmax/g)
tmax=2*th

'bereken de beginsnelheid die nodig is om de gekozen hoogte te halen
vz0=math.SquareRoot(2*g*hmax)

'bereken de snelheid in x en y-richting
vx=(x1-x0)/tmax
vy=(y1-y0)/tmax

endsub


Sub TekenSpeelVeld
GraphicsWindow.BrushColor="Lime"
GraphicsWindow.FillTriangle(dx+p[1]["xn"],dy+p[1]["yn"],dx+p[2]["xn"],dy+p[2]["yn"],dx+p[3]["xn"],dy+p[3]["yn"])
GraphicsWindow.FillTriangle(dx+p[2]["xn"],dy+p[2]["yn"],dx+p[3]["xn"],dy+p[3]["yn"],dx+p[4]["xn"],dy+p[4]["yn"])

' GraphicsWindow.DrawLine(0,100,2*halveveldlengte*schaal,100)
EndSub

Sub TekenNet
GraphicsWindow.DrawLine(dx+p[5]["xn"],dy+p[5]["yn"],dx+p[6]["xn"],dy+p[6]["yn"])
GraphicsWindow.DrawLine(dx+p[7]["xn"],dy+p[7]["yn"],dx+p[8]["xn"],dy+p[8]["yn"])
GraphicsWindow.DrawLine(dx+p[5]["xn"],dy+p[5]["yn"],dx+p[7]["xn"],dy+p[7]["yn"])
GraphicsWindow.DrawLine(dx+p[6]["xn"],dy+p[6]["yn"],dx+p[8]["xn"],dy+p[8]["yn"])

' GraphicsWindow.DrawLine(halveveldlengte*schaal,100,halveveldlengte*schaal,100-nethoogte*schaal)

EndSub

Sub TekenBal

'bereken de positie van de bal
xt=x0+vx*t
yt=y0+vy*t
zt=vz0*t-0.5*g*t*t

' bereken schermpositiebal
p[9]["x"]=xt
p[9]["y"]=yt
p[9]["z"]=zt

BerekenBal()

'teken de bal
' GraphicsWindow.DrawEllipse((xt)*schaal-balgrootte,100-zt*schaal-balgrootte,balgrootte,balgrootte)
GraphicsWindow.DrawEllipse(dx+p[9]["xn"]-balgrootte/2,dy+p[9]["yn"]-balgrootte/2,balgrootte,balgrootte)

Endsub