morph demo

Share your advanced PureBasic knowledge/code with the community.
Thomas
Enthusiast
Enthusiast
Posts: 112
Joined: Sat Apr 26, 2003 8:45 pm

morph demo

Post 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
MrMat
Enthusiast
Enthusiast
Posts: 762
Joined: Sun Sep 05, 2004 6:27 am
Location: England

Post by MrMat »

Very pretty :-D That would make a nice screensaver!
ebs
Enthusiast
Enthusiast
Posts: 561
Joined: Fri Apr 25, 2003 11:08 pm

Post by ebs »

Thomas,

I really like it! :D

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

Regards,
Eric
Last edited by ebs on Wed Oct 13, 2004 11:17 pm, edited 1 time in total.
Ralf
Enthusiast
Enthusiast
Posts: 203
Joined: Fri May 30, 2003 1:29 pm
Location: Germany

Post 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 
benny
Enthusiast
Enthusiast
Posts: 465
Joined: Fri Apr 25, 2003 7:44 pm
Location: end of www
Contact:

Post 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
regards,
benny!
-
pe0ple ar3 str4nge!!!
ebs
Enthusiast
Enthusiast
Posts: 561
Joined: Fri Apr 25, 2003 11:08 pm

Post 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
User avatar
GedB
Addict
Addict
Posts: 1313
Joined: Fri May 16, 2003 3:47 pm
Location: England
Contact:

Post 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?
Thomas
Enthusiast
Enthusiast
Posts: 112
Joined: Sat Apr 26, 2003 8:45 pm

Post 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
Last edited by Thomas on Sat Oct 16, 2004 10:45 am, edited 6 times in total.
Thomas
Enthusiast
Enthusiast
Posts: 112
Joined: Sat Apr 26, 2003 8:45 pm

Post 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.
Last edited by Thomas on Sat Oct 16, 2004 9:57 am, edited 2 times in total.
User avatar
Comtois
Addict
Addict
Posts: 1431
Joined: Tue Aug 19, 2003 11:36 am
Location: Doubs - France

Post 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 
Please correct my english
http://purebasic.developpez.com/
wilbert
PureBasic Expert
PureBasic Expert
Posts: 3943
Joined: Sun Aug 08, 2004 5:21 am
Location: Netherlands

Post 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
Thomas
Enthusiast
Enthusiast
Posts: 112
Joined: Sat Apr 26, 2003 8:45 pm

Post 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
Last edited by Thomas on Sat Oct 16, 2004 6:09 pm, edited 2 times in total.
GPI
PureBasic Expert
PureBasic Expert
Posts: 1394
Joined: Fri Apr 25, 2003 6:41 pm

Post by GPI »

My version (with 3D-Sprites)

http://gpihome.de/purebasic/morph3d.rar
User avatar
griz
Enthusiast
Enthusiast
Posts: 167
Joined: Sun Jun 29, 2003 7:32 pm
Location: Canada

Post 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.
Dare2
Moderator
Moderator
Posts: 3321
Joined: Sat Dec 27, 2003 3:55 am
Location: Great Southern Land

Post by Dare2 »

Awesome stuff.

* writes to Santa requesting a brain *
@}--`--,-- A rose by any other name ..
Post Reply