home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AMOS PD CD
/
amospdcd.iso
/
sourcecode
/
various
/
3d_cube.amos
/
3d_cube.amosSourceCode
next >
Wrap
AMOS Source Code
|
1993-01-08
|
3KB
|
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