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

