Page 1 of 2

morph demo

Posted: Wed Oct 13, 2004 6:54 pm
by Thomas
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. 8)

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

Posted: Wed Oct 13, 2004 7:48 pm
by MrMat
Very pretty :-D That would make a nice screensaver!

Posted: Wed Oct 13, 2004 9:02 pm
by ebs
Thomas,

I really like it! :D

Original message removed - it works fine! It was my mistake. :(

Regards,
Eric

Posted: Wed Oct 13, 2004 10:46 pm
by Ralf
Hi Thomas!
congratulation. very cool! i will study how the objects are created but now i am to tired and need a bit sleep ;) just following modified setcolor procedure i made in a real hurry - its not the best but results should looks more 3d space :-)

Code: Select all

Procedure setcolor(t.f) 
  mycolor = t

  If t <= 200 And t >= -200 
    mycolor = mycolor * 2
    FrontColor(mycolor,mycolor,mycolor)
  Else
    mycolor = mycolor * 2
    FrontColor(mycolor,mycolor,mycolor) 
  EndIf

EndProcedure 

Posted: Wed Oct 13, 2004 11:18 pm
by benny
@Thomas:
Well done :!: Nice FX ... always like such oldschool morph fx.

I tried to speed up your routine a bit. Have a look at the modified
setcolor routine. It now just returns the color-value.
So you are able to call the Plot command with the color-statement
which is faster :!:

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 

Dim points(numdots,3) 
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(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) 
  c.l = setcolor(tz) 
  Plot(nx,ny,RGB(c.l,c.l,c.l)) 
Next 
EndProcedure 

Procedure.l setcolor(t.f) 
If t<=200 And t>=75 
  ;FrontColor(255,255,255) 
  ProcedureReturn 255
EndIf 
If t<=75 And t>=50 
;  FrontColor(225,225,225) 
  ProcedureReturn 225
EndIf 
If t<=50 And t>=25 
;  FrontColor(200,200,200) 
  ProcedureReturn 200
EndIf 
If t<=25 And t>=0 
;  FrontColor(175,175,175) 
  ProcedureReturn 175
EndIf 
If t<=0 And t>=-25 
;  FrontColor(150,150,150) 
  ProcedureReturn 150
EndIf 
If t<=-25 And t>=-50 
;  FrontColor(125,125,125) 
  ProcedureReturn 125
EndIf 
If t<=-50 And t>=-75 
;  FrontColor(100,100,100) 
  ProcedureReturn 100
EndIf 
If t<=-75 And t>=-200 
;  FrontColor(50,50,50) 
  ProcedureReturn 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

Posted: Thu Oct 14, 2004 1:23 am
by ebs
@Benny,
Your change to SetColor() certainly made a difference!

@Thomas,
I hope you don't mind, but I did some more things to speed up your code, like replacing variables with constants, changing SetColor() to use integers instead of floats, and removing some variable assignments.

I don't think I messed anything up, but please let me know if I did!

Regards,
Eric

Code: Select all

InitKeyboard()
InitSprite()
OpenScreen(640,480,32,"")

#numdots=10000
#numobjs=20
#distance=400

Global vx.f
Global vy.f
Global vz.f
Global object

object=1

Dim points(#numdots,3)
Dim tpoint(#numdots,3)

Declare object(obj)
Declare morphing()
Declare threed()
Declare setcolor(tz.l)

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(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)
    c.l = setcolor(Int(tz))
    Plot(nx,ny,RGB(c,c,c))
  Next
EndProcedure

Procedure.l setcolor(t.l)
  If t<=200 And t>=75
    ProcedureReturn 255
  EndIf
  If t<=75 And t>=50
    ProcedureReturn 225
  EndIf
  If t<=50 And t>=25
    ProcedureReturn 200
  EndIf
  If t<=25 And t>=0
    ProcedureReturn 175
  EndIf
  If t<=0 And t>=-25
    ProcedureReturn 150
  EndIf
  If t<=-25 And t>=-50
    ProcedureReturn 125
  EndIf
  If t<=-50 And t>=-75
    ProcedureReturn 100
  EndIf
  If t<=-75 And t>=-200
    ProcedureReturn 50
  EndIf
EndProcedure 

Procedure object(obj)
  Select obj
    Case 1
      For t=1 To #numdots
        points(t,1)=(Random(1800)-900)/10*t/#numdots
        points(t,2)=(Random(1800)-900)/10*t/#numdots
        points(t,3)=(Random(1800)-900)/10*t/#numdots
      Next
    Case 2
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*100
      Next
    Case 3
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)* 100
      Next
    Case 4
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 5
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Cos(xd)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 6
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 7
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(t*360/#numdots)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 8
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*Sin(t*360/#numdots)*100
      Next
    Case 9
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*Cos(xd)*100
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100
      Next
    Case 10
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Cos(xd)*Sin(xd)*100
      Next
    Case 11
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(t*360/#numdots)*Cos(xd)*100
        points(t,2) = Cos(xd)*Sin(xd)*100
        points(t,3) = Sin(xd)*100
      Next
    Case 12
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*100
      Next
    Case 13
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(t*360/#numdots)*Cos(xd)*100
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*Cos(xd)*200
      Next
    Case 14
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 15
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(xd)*Cos(xd)*100
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 16
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100
      Next
    Case 17
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*Sin(t*360/#numdots)*100
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*100
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100
      Next
    Case 18
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 19
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,3) = Cos(xd)*100
      Next
    Case 20
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(xd)*Cos(xd)*Sin(t*360/#numdots)*200
        points(t,2) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*200
        points(t,3) = Sin(t*360/#numdots)*Cos(xd)*Cos(t*360/#numdots)*200
      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
      ElseIf points(t,q)<tpoint(t,q)
        tpoint(t,q)=tpoint(t,q)-1
      EndIf
    Next
  Next
EndProcedure

Posted: Thu Oct 14, 2004 9:29 am
by GedB
This is incredible. How does the code describe so many different shapes?

How could i even begin to understand the math going on here?

Posted: Thu Oct 14, 2004 6:23 pm
by Thomas
Since it's lightning fast now, the number of dots has been increased and also the screen size. Adjust #width, #height and #numdots to fit your system's speed. Hit <Esc> to stop the program.

Code: Select all

InitKeyboard() 
InitSprite() 

#width=1280 
#height=960 
;#height=1024 ; for a TFT monitor
#numdots=50000 

OpenScreen(#width,#height,32,"") 

#xhalf=#width/2 
#yhalf=#height/2 
#size=#height 

#numobjs=20 
#distance=400 

Global vx.f 
Global vy.f 
Global vz.f 
Global object 

object=1 

Dim points(#numdots,3) 
Dim tpoint(#numdots,3) 

Declare object(obj) 
Declare morphing() 
Declare threed() 
Declare setcolor(tz.l) 

object(object) 

Repeat 
  StartDrawing(ScreenOutput()) 
  gtc=GetTickCount_() 
  If gtc-ti>10000 
    fps.f=fcnt/(gtc-ti)*1000 
    fcnt=0 
    ti=gtc 
  EndIf 
  Locate(1,1) 
  DrawingMode(1) 
  FrontColor(255,255,255) 
  DrawText(StrF(fps)+" fps") 
  cnt=cnt+1 
  fcnt=fcnt+1 
  If cnt>299 
    object=object+1 
    If object>#numobjs 
      object=1 
    EndIf 
    object(object) 
    cnt=0 
  EndIf 
  morphing() 
  threed() 
  StopDrawing() 
  FlipBuffers(0) 
  ClearScreen(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=#size*tx/(#distance-tz)+#xhalf 
    ny=#yhalf-#size*ty/(#distance-tz)
    c.l = setcolor(tz) 
    Plot(nx,ny,RGB(c,c,c)) 
  Next 
EndProcedure 

Procedure.l setcolor(t.l) 
  If t<=200 And t>=75 
    ProcedureReturn 255 
  EndIf 
  If t<75 And t>-175 
    ProcedureReturn t+180 
  EndIf 
  If t<=-175 And t>=-200 
    ProcedureReturn 5 
  EndIf 
EndProcedure 

Procedure object(obj) 
  Select obj 
    Case 1 
      For t=1 To #numdots 
        points(t,1)=(Random(1800)-900)/10*t/#numdots 
        points(t,2)=(Random(1800)-900)/10*t/#numdots 
        points(t,3)=(Random(1800)-900)/10*t/#numdots 
      Next 
    Case 2 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*100 
      Next 
    Case 3 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)* 100 
      Next 
    Case 4 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 5 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Cos(xd)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 6 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 7 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(t*360/#numdots)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 8 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*Sin(t*360/#numdots)*100 
      Next 
    Case 9 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*Cos(xd)*100 
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100 
      Next 
    Case 10 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Cos(xd)*Sin(xd)*100 
      Next 
    Case 11 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(t*360/#numdots)*Cos(xd)*100 
        points(t,2) = Cos(xd)*Sin(xd)*100 
        points(t,3) = Sin(xd)*100 
      Next 
    Case 12 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*100 
      Next 
    Case 13 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(t*360/#numdots)*Cos(xd)*100 
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*Cos(xd)*200 
      Next 
    Case 14 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 15 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(xd)*Cos(xd)*100 
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 16 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100 
      Next 
    Case 17 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*Sin(t*360/#numdots)*100 
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100 
      Next 
    Case 18 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 19 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,3) = Cos(xd)*100 
      Next 
    Case 20 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(xd)*Cos(xd)*Sin(t*360/#numdots)*200 
        points(t,2) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*200 
        points(t,3) = Sin(t*360/#numdots)*Cos(xd)*Cos(t*360/#numdots)*200 
      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 
      ElseIf points(t,q)<tpoint(t,q) 
        tpoint(t,q)=tpoint(t,q)-1 
      EndIf 
    Next 
  Next 
EndProcedure

Posted: Sat Oct 16, 2004 8:14 am
by Thomas
The code above now includes a framerate counter which updates every 10 sec. Maybe there are some more optimizations to be found. I get 27 fps on an Athlon XP 3000+. The graphics card is not so important because the program does not use 3D functions.

Posted: Sat Oct 16, 2004 8:51 am
by Comtois
GedB wrote:This is incredible. How does the code describe so many different shapes?

How could i even begin to understand the math going on here?
http://www.mathcurve.com/surfaces/surfaces.shtml

For a Sphere
http://www.mathcurve.com/surfaces/sphere/sphere.shtml
x = R * cos(u) * cos(v)
y = R * sin(u) * cos(v)
z = R * sin(v)
and now you can replace

Code: Select all

    Case 2 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*100 
      Next


by this

Code: Select all

Case 2 ;Sphere
      R=100
      For T=1 To #numdots 
        v.f=(Random(180)-90) * 0.0174533 ; -Pi/2 <= v <= Pi/2 ( -90°<= v <= 90° )
        u.f=(T*360/#numdots) * 0.0174533
        points(T,1) = R*Cos(u)*Cos(v) 
        points(T,2) = R*Sin(u)*Cos(v) 
        points(T,3) = R*Sin(v) 
      Next 

Posted: Sat Oct 16, 2004 10:43 am
by wilbert
Further optimization of the threed routine

Code: Select all

InitKeyboard()
InitSprite()

#width=1024
#height=768
#numdots=30000

OpenScreen(#width,#height,32,"")

#xhalf=#width/2
#yhalf=#height/2
#size=#height

#numobjs=20
#distance=400

Global vx.f
Global vy.f
Global vz.f
Global object

object=1

Dim points(#numdots,3)
Dim tpoint(#numdots,3)

Declare object(obj)
Declare morphing()
Declare threed()

object(object)

Repeat
  StartDrawing(ScreenOutput())
  gtc=GetTickCount_()
  If gtc-ti>10000
    fps.f=fcnt/(gtc-ti)*1000
    fcnt=0
    ti=gtc
  EndIf
  Locate(1,1)
  DrawingMode(1)
  FrontColor(255,255,255)
  DrawText(StrF(fps)+" fps")
  cnt=cnt+1
  fcnt=fcnt+1
  If cnt>299
    object=object+1
    If object>#numobjs
      object=1
    EndIf
    object(object)
    cnt=0
  EndIf
  morphing()
  threed()
  StopDrawing()
  FlipBuffers(0)
  ClearScreen(0,0,0)
  ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)

Procedure threed()
  vx=vx+0.05
  vy=vy+0.05
  vz=vz+0.05 
  sinvx.f = Sin(vx)
  cosvx.f = Cos(vx)
  sinvy.f = Sin(vy)
  cosvy.f = Cos(vy)
  sinvz.f = Sin(vz)
  cosvz.f = Cos(vz)
  For n=1 To #numdots
    x3d=tpoint(n,1)
    y3d=tpoint(n,2)
    z3d=tpoint(n,3)
    ty.f=y3d*cosvx-z3d*sinvx
    tz.f=y3d*sinvx+z3d*cosvx
    tx.f=x3d*cosvy-tz*sinvy
    tz.f=x3d*sinvy+tz*cosvy
    ox.f=tx
    tx=tx*cosvz-ty*sinvz
    ty=ox*sinvz+ty*cosvz
    nx=#size*tx/(#distance-tz)+#xhalf
    ny=#yhalf-#size*ty/(#distance-tz)
    t.l = Int(tz)
    If t>200
    ElseIf t>75
      Plot(nx,ny,$ffffff)
    ElseIf t>50
      Plot(nx,ny,$e1e1e1)
    ElseIf t>25
      Plot(nx,ny,$c8c8c8)
    ElseIf t>0
      Plot(nx,ny,$afafaf)
    ElseIf t>-25
      Plot(nx,ny,$969696)
    ElseIf t>-50
      Plot(nx,ny,$7d7d7d)
    ElseIf t>-75
      Plot(nx,ny,$646464)
    ElseIf t>-200
      Plot(nx,ny,$323232)
    EndIf
  Next
EndProcedure

Procedure object(obj)
  Select obj
    Case 1
      For t=1 To #numdots
        points(t,1)=(Random(1800)-900)/10*t/#numdots
        points(t,2)=(Random(1800)-900)/10*t/#numdots
        points(t,3)=(Random(1800)-900)/10*t/#numdots
      Next
    Case 2
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*100
      Next
    Case 3
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)* 100
      Next
    Case 4
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 5
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Cos(xd)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 6
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 7
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(t*360/#numdots)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 8
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*Sin(t*360/#numdots)*100
      Next
    Case 9
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*Cos(xd)*100
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100
      Next
    Case 10
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Cos(xd)*Sin(xd)*100
      Next
    Case 11
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(t*360/#numdots)*Cos(xd)*100
        points(t,2) = Cos(xd)*Sin(xd)*100
        points(t,3) = Sin(xd)*100
      Next
    Case 12
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*100
      Next
    Case 13
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(t*360/#numdots)*Cos(xd)*100
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*Cos(xd)*200
      Next
    Case 14
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 15
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(xd)*Cos(xd)*100
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 16
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100
      Next
    Case 17
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*Sin(t*360/#numdots)*100
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*100
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100
      Next
    Case 18
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Cos(xd)*100
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100
        points(t,3) = Sin(t*360/#numdots)*100
      Next
    Case 19
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Cos(xd)*Sin(t*360/#numdots)*100
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100
        points(t,3) = Cos(xd)*100
      Next
    Case 20
      For t=1 To #numdots
        xd=Random(1800)
        points(t,1) = Sin(xd)*Cos(xd)*Sin(t*360/#numdots)*200
        points(t,2) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*200
        points(t,3) = Sin(t*360/#numdots)*Cos(xd)*Cos(t*360/#numdots)*200
      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
      ElseIf points(t,q)<tpoint(t,q)
        tpoint(t,q)=tpoint(t,q)-1
      EndIf
    Next
  Next
EndProcedure

Posted: Sat Oct 16, 2004 11:25 am
by Thomas
Here the final version, I think it's fast enough now :D . Thanks to all optimizers.

Code: Select all

InitKeyboard() 
InitSprite() 

#width=1280 
#height=960 
;#height=1024 ; for a TFT monitor 
#numdots=100000 

OpenScreen(#width,#height,32,"") 

#xhalf=#width/2 
#yhalf=#height/2 
#size=#height 

#numobjs=20 
#distance=400 

Global vx.f 
Global vy.f 
Global vz.f 
Global object 

object=1 

Dim points(#numdots,3) 
Dim tpoint(#numdots,3) 

Declare object(obj) 
Declare morphing() 
Declare threed() 

object(object) 

Repeat 
  StartDrawing(ScreenOutput()) 
  gtc=GetTickCount_() 
  If gtc-ti>10000 
    fps.f=fcnt/(gtc-ti)*1000 
    fcnt=0 
    ti=gtc 
  EndIf 
  Locate(1,1) 
  DrawingMode(1) 
  FrontColor(255,255,255) 
  DrawText(StrF(fps)+" fps") 
  cnt=cnt+1 
  fcnt=fcnt+1 
  If cnt>499 
    object=object+1 
    If object>#numobjs 
      object=1 
    EndIf 
    object(object) 
    cnt=0 
  EndIf 
  morphing() 
  threed() 
  StopDrawing() 
  FlipBuffers(0) 
  ClearScreen(0,0,0) 
  ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_Escape) 

Procedure threed() 
  vx=vx+0.01 
  vy=vy+0.01 
  vz=vz+0.01 
  sinvx.f = Sin(vx) 
  cosvx.f = Cos(vx) 
  sinvy.f = Sin(vy) 
  cosvy.f = Cos(vy) 
  sinvz.f = Sin(vz) 
  cosvz.f = Cos(vz) 
  For n=1 To #numdots 
    x3d=tpoint(n,1) 
    y3d=tpoint(n,2) 
    z3d=tpoint(n,3) 
    ty.f=y3d*cosvx-z3d*sinvx 
    tz.f=y3d*sinvx+z3d*cosvx 
    tx.f=x3d*cosvy-tz*sinvy 
    tz.f=x3d*sinvy+tz*cosvy 
    ox.f=tx 
    tx=tx*cosvz-ty*sinvz 
    ty=ox*sinvz+ty*cosvz 
    nx=#size*tx/(#distance-tz)+#xhalf 
    ny=#yhalf-#size*ty/(#distance-tz) 
    t=tz 
    If t<=200 And t>=75 
      c=255 
    EndIf 
    If t<75 And t>-175 
      c=tz+180 
    EndIf 
    If t<=-175 And t>=-200 
      c=5 
    EndIf 
    Plot(nx,ny,RGB(c,c,c)) 
  Next 
EndProcedure 

Procedure object(obj) 
  Select obj 
    Case 1 
      For t=1 To #numdots 
        points(t,1)=(Random(1800)-900)/10*t/#numdots 
        points(t,2)=(Random(1800)-900)/10*t/#numdots 
        points(t,3)=(Random(1800)-900)/10*t/#numdots 
      Next 
    Case 2 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*100 
      Next 
    Case 3 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 4 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 5 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Cos(xd)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 6 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 7 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(t*360/#numdots)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 8 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*Sin(t*360/#numdots)*100 
      Next 
    Case 9 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*Cos(xd)*100 
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100 
      Next 
    Case 10 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Cos(xd)*Sin(xd)*100 
      Next 
    Case 11 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*100 
      Next 
    Case 12 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(t*360/#numdots)*Cos(xd)*100 
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*Cos(xd)*200 
      Next 
    Case 13 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 14 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(xd)*Cos(xd)*100 
        points(t,2) = Sin(xd)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 15 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100 
      Next 
    Case 16 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(t*360/#numdots)*Sin(t*360/#numdots)*100 
        points(t,2) = Sin(t*360/#numdots)*Sin(xd)*Cos(t*360/#numdots)*100 
        points(t,3) = Sin(xd)*Cos(t*360/#numdots)*100 
      Next 
    Case 17 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Cos(xd)*100 
        points(t,2) = Cos(t*360/#numdots)*Sin(t*360/#numdots)*100 
        points(t,3) = Sin(t*360/#numdots)*100 
      Next 
    Case 18 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Cos(xd)*Sin(t*360/#numdots)*100 
        points(t,2) = Cos(xd)*Cos(t*360/#numdots)*100 
        points(t,3) = Cos(xd)*100 
      Next 
    Case 19 
      For t=1 To #numdots 
        xd=Random(1800) 
        points(t,1) = Sin(xd)*Cos(xd)*Sin(t*360/#numdots)*200 
        points(t,2) = Sin(t*360/#numdots)*Cos(t*360/#numdots)*Sin(xd)*200 
        points(t,3) = Sin(t*360/#numdots)*Cos(xd)*Cos(t*360/#numdots)*200 
      Next
    Case 20 
      For t=1 To #numdots
        Points(t,2)=Random(150)-75
        Points(t,3)=Random(150)-75
        Points(t,1)=Random(150)-75
        If Random(1)
          Points(t,Random(2)+1)=75
        Else
          Points(t,Random(2)+1)=-75
        EndIf
      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 
      ElseIf points(t,q)<tpoint(t,q) 
        tpoint(t,q)=tpoint(t,q)-1 
      EndIf 
    Next 
  Next 
EndProcedure

Posted: Sat Oct 16, 2004 4:29 pm
by GPI
My version (with 3D-Sprites)

http://gpihome.de/purebasic/morph3d.rar

Posted: Sun Oct 17, 2004 1:08 am
by griz
The graphics card is not so important because the program does not use 3D functions.
I was getting about 26 fps with an Athlon XP 2400 ... only 1 fps slower than your XP 3000. I wonder if graphics card performance does play more of a role? Clearing the screen and painting pixels may be plain faster on some graphics cards. I've got a Radeon 9700 non pro in this machine, what kind of a graphics card are you using? In the (latest) final version of your program (posted above) I get 41 fps.

Posted: Sun Oct 17, 2004 3:29 am
by Dare2
Awesome stuff.

* writes to Santa requesting a brain *