morph demo
Posted: Wed Oct 13, 2004 6:54 pm
Code updated For 5.20+
Found this one for Blitz some time ago. Optimized and added some stuff and now it runs on Pure even better.
It shows morphing of some mathematical forms. Adjust numdots if it is too slow for you.
Found this one for Blitz some time ago. Optimized and added some stuff and now it runs on Pure even better.

It shows morphing of some mathematical forms. Adjust numdots if it is too slow for you.
Code: Select all
InitKeyboard()
InitSprite()
OpenScreen(640,480,32,"")
Global numdots
Global numobjs
Global distance
Global vx.f
Global vy.f
Global vz.f
Global object
numdots=10000
numobjs=20
distance=400
object=1
Global Dim points(numdots,3)
Global Dim tpoint(numdots,3)
Declare object(obj)
Declare morphing()
Declare threed()
Declare setcolor(tz.f)
object(object)
Repeat
StartDrawing(ScreenOutput())
cnt=cnt+1
If cnt>299
object=object+1
If object>numobjs
object=1
EndIf
object(object)
cnt=0
EndIf
morphing()
threed()
StopDrawing()
FlipBuffers()
ClearScreen(RGB(0,0,0))
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
Procedure threed()
vx=vx+0.05
vy=vy+0.05
vz=vz+0.05
For n=1 To numdots
x3d=tpoint(n,1)
y3d=tpoint(n,2)
z3d=tpoint(n,3)
ty.f=y3d*Cos(vx)-z3d*Sin(vx)
tz.f=y3d*Sin(vx)+z3d*Cos(vx)
tx.f=x3d*Cos(vy)-tz*Sin(vy)
tz.f=x3d*Sin(vy)+tz*Cos(vy)
ox.f=tx
tx=tx*Cos(vz)-ty*Sin(vz)
ty=ox*Sin(vz)+ty*Cos(vz)
nx=Round(512*tx/(distance-tz),0)+320
ny=Round(240-512*ty/(distance-tz),0)
setcolor(tz)
Plot(nx,ny)
Next
EndProcedure
Procedure setcolor(t.f)
If t<=200 And t>=75
FrontColor(RGB(255,255,255))
EndIf
If t<=75 And t>=50
FrontColor(RGB(225,225,225))
EndIf
If t<=50 And t>=25
FrontColor(RGB(200,200,200))
EndIf
If t<=25 And t>=0
FrontColor(RGB(175,175,175))
EndIf
If t<=0 And t>=-25
FrontColor(RGB(150,150,150))
EndIf
If t<=-25 And t>=-50
FrontColor(RGB(125,125,125))
EndIf
If t<=-50 And t>=-75
FrontColor(RGB(100,100,100))
EndIf
If t<=-75 And t>=-200
FrontColor(RGB(50,50,50))
EndIf
EndProcedure
Procedure object(obj)
Select obj
Case 1
For t=1 To numdots
points(t,2)=(Random(1800)-900)/10*t/numdots
points(t,3)=(Random(1800)-900)/10*t/numdots
points(t,1)=(Random(1800)-900)/10*t/numdots
Next
Case 2
For t=1 To numdots
xd=Random(1800)
x.f=Cos(xd)*Cos(t*360/numdots)*100
y.f=Cos(xd)*Sin(t*360/numdots)*100
z.f=Sin(xd)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 3
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(t*360/numdots)*100
y=Cos(xd)*Sin(t*360/numdots)*100
z=Sin(t*360/numdots)* 100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 4
For t=1 To numdots
xd=Random(1800)
x=Sin(t*360/numdots)*Cos(t*360/numdots)*100
y=Cos(xd)*Cos(t*360/numdots)*100
z=Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 5
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(xd)*100
y=Cos(xd)*Sin(xd)*100
z=Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 6
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(xd)*100
y=Cos(t*360/numdots)*Sin(xd)*100
z=Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 7
For t=1 To numdots
xd=Random(1800)
x=Cos(t*360/numdots)*Cos(t*360/numdots)*100
y=Cos(t*360/numdots)*Sin(xd)*100
z=Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 8
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(t*360/numdots)*100
y=Cos(xd)*Sin(t*360/numdots)*100
z=Sin(xd)*Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 9
For t=1 To numdots
xd=Random(1800)
x=Sin(t*360/numdots)*Cos(t*360/numdots)*Sin(xd)*100
y=Cos(t*360/numdots)*Sin(xd)*Cos(xd)*100
z=Sin(xd)*Cos(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 10
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(t*360/numdots)*100
y=Cos(t*360/numdots)*Sin(xd)*100
z=Cos(xd)*Sin(xd)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 11
For t=1 To numdots
xd=Random(1800)
x=Cos(t*360/numdots)*Cos(xd)*100
y=Cos(xd)*Sin(xd)*100
z=Sin(xd)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 12
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(t*360/numdots)*100
y=Sin(xd)*Sin(t*360/numdots)*100
z=Sin(xd)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 13
For t=1 To numdots
xd=Random(1800)
x=Cos(t*360/numdots)*Cos(xd)*100
y=Sin(t*360/numdots)*Sin(xd)*100
z=Sin(t*360/numdots)*Sin(xd)*Cos(t*360/numdots)*Cos(xd)*200
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 14
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(xd)*100
y=Sin(t*360/numdots)*Sin(xd)*100
z=Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 15
For t=1 To numdots
xd=Random(1800)
x=Sin(xd)*Cos(xd)*100
y=Sin(xd)*Sin(t*360/numdots)*100
z=Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 16
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(t*360/numdots)*100
y=Cos(t*360/numdots)*Sin(t*360/numdots)*100
z=Sin(xd)*Cos(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 17
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(t*360/numdots)*Sin(t*360/numdots)*100
y=Sin(t*360/numdots)*Sin(xd)*Cos(t*360/numdots)*100
z=Sin(xd)*Cos(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 18
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Cos(xd)*100
y=Cos(t*360/numdots)*Sin(t*360/numdots)*100
z=Sin(t*360/numdots)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 19
For t=1 To numdots
xd=Random(1800)
x=Cos(xd)*Sin(t*360/numdots)*100
y=Cos(xd)*Cos(t*360/numdots)*100
z=Cos(xd)*100
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
Case 20
For t=1 To numdots
xd=Random(1800)
x=Sin(xd)*Cos(xd)*Sin(t*360/numdots)*200
y=Sin(t*360/numdots)*Cos(t*360/numdots)*Sin(xd)*200
z=Sin(t*360/numdots)*Cos(xd)*Cos(t*360/numdots)*200
points(t,1)=x
points(t,2)=y
points(t,3)=z
Next
EndSelect
EndProcedure
Procedure morphing()
For t=1 To numdots
For q=1 To 3
If points(t,q)>tpoint(t,q)
tpoint(t,q)=tpoint(t,q)+1
EndIf
If points(t,q)<tpoint(t,q)
tpoint(t,q)=tpoint(t,q)-1
EndIf
Next
Next
EndProcedure