home *** CD-ROM | disk | FTP | other *** search
AMOS Source Code | 1993-01-08 | 3.1 KB | 127 lines |
- 'Cube Demo by David Seeto
- 'Angles stored in array for faster operation
- 'Only four vertices used because the solid is a square
- 'The viewer only sees to faces at a time,therefore speeding up hidden surface removal
- 'Note how the cube changes shade as it rotates.
- 'Isn't this great!!
- Procedure TRANSFORM[X#,F#]
- T#=X#*F#
- If T#<0.0
- C=-Int(Abs(T#))
- Else C=Int(T#)
- End If
- End Proc[C]
- Procedure NEWDIR
- C#=Rnd(60)+40
- End Proc[C#]
- Procedure CONVERT2D
- For I=0 To NRVERTICIES-1
- F#=1000.0/(DISTANCE#-Z#(I))
- TRANSFORM[X#(I),F#]
- X2D#(I)=Param
- TRANSFORM[Y#(I),F#]
- Y2D#(I)=Param
- Next I
- End Proc
- Procedure DCUBE
- LEFT=X2D#(0) : I=0
- For VERTEX=1 To NRVERTICIES-1
- If X2D#(VERTEX)<LEFT
- LEFT=X2D#(VERTEX)
- I=VERTEX
- End If
- Next VERTEX
- J=(I+1) mod NRVERTICIES
- K=(I+2) mod NRVERTICIES
- Screen Swap : Wait Vbl : Cls 0
- If X2D#(J)>=X2D#(K) Then RIGHTOBSCURED=True Else RIGHTOBSCURED=False
- If RIGHTOBSCURED Then Ink 2 Else Ink 1
- Polygon CX+X2D#(I),CY+Y2D#(I) To CX+X2D#(J),CY+Y2D#(J) To CX+X2D#(J),CY-Y2D#(J) To CX+X2D#(I),CY-Y2D#(I) To CX+X2D#(I),CY+Y2D#(I)
- If Not RIGHTOBSCURED
- Ink 2
- Polygon CX+X2D#(J),CY+Y2D#(J) To CX+X2D#(K),CY+Y2D#(K) To CX+X2D#(K),CY-Y2D#(K) To CX+X2D#(J),CY-Y2D#(J)
- End If
- Colour 2,Val(Hex$(ANGLE/8+4))
- Colour 1,Val(Hex$((89-ANGLE)/8+4))
- End Proc
- Procedure YROTATION
- Inc MCOUNT
- If MCOUNT>=MX
- MCOUNT=0 :
- Add PHI,PHIDIR
- If(PHI<=-LMANGLE) and(PHIDIR<0) or(PHI>=LMANGLE) and(PHIDIR>0)
- LMANGLE=Rnd(MANGLE/2-1)+MANGLE/2-1
- PHIDIR=-PHIDIR
- End If
- End If
- Add ANGLE,PHI
- ANGLE=(ANGLE+90) mod 90
- CPHI#=COPHI#(Abs(PHI))
- If PHI<0
- SPHI#=-SIPHI#(Abs(PHI))
- Else SPHI#=SIPHI#(PHI)
- End If
- For I=0 To NRVERTICIES-1
- LX#=X#(I) : LZ#=Z#(I)
- X#(I)=LX#*CPHI#-LZ#*SPHI#
- Z#(I)=LZ#*CPHI#+LX#*SPHI#
- Next I
- End Proc
- Procedure CALC[N]
- While N>0
- YROTATION
- CONVERT2D
- DCUBE
- Dec N
- Wend
- End Proc
- Screen Open 0,320,200,16,Lowres
- Hide : Cls 0
- Unpack 16 To 1
- Wait Key
- Fade 10 : Wait 150
- Screen Open 0,320,200,4,Lowres
- Curs Off : Cls 0 : Flash Off
- Double Buffer : Autoback 0 : Screen Swap
- CX=160 : CY=100
- Global CX,CY
- MANGLE=20
- MX=8
- Dim SIPHI#(MANGLE),COPHI#(MANGLE)
- Global SIPHI#(),COPHI#()
- Global PHI,PHIDIR,MANGLE,MX,LMANGLE,ANGLE,MCOUNT
- PHI=0 : PHIDIR=1
- MX=8
- Degree
- LMANGLE=Rnd(MANGLE/2-1)+MANGLE/2-1
- ANGLE=0 : MCOUNT=MX
- For I=0 To MANGLE
- SIPHI#(I)=Sin(I)
- COPHI#(I)=Cos(I)
- Next I
- DISTANCE#=6500.0
- NRVERTICIES=4
- Global DISTANCE#,NRVERTICIES
- Dim X#(NRVERTICIES-1),Y#(NRVERTICIES-1),Z#(NRVERTICIES-1)
- Dim X2D#(NRVERTICIES-1),Y2D#(NRVERTICIES-1)
- Global X#(),Y#(),Z#(),X2D#(),Y2D#()
- X#(0)=-150.0 : Y#(0)=150.0 : Z#(0)=150.0
- X#(1)=150.0 : Y#(1)=150.0 : Z#(1)=150.0
- X#(2)=150.0 : Y#(2)=150.0 : Z#(2)=-150.0
- X#(3)=-150.0 : Y#(3)=150.0 : Z#(3)=-150.0
- CALC[40]
- NEWDIR
- D#=Param#
- For I=1 To 500
- CALC[1]
- DISTANCE#=DISTANCE#+D#
- If DISTANCE#<=1800.0
- NEWDIR
- D#=Param# : CALC[Rnd(30)+20]
- End If
- If DISTANCE#>=6500.0
- NEWDIR
- D#=-Param# : CALC[Rnd(30)+20]
- End If
- Next I
- End