Code: Select all
SCREEN 800, 600
Function IIf(cond,truev,falsev)
If cond Then
Return truev
Else
Return falsev
EndIf
EndFunction
Scale# = 1
Size = 5
Mode = 0
DMode = 0
CamX = 0
CamY = 0
CamZ = 300
MoveX = 0
MoveY = 0
MoveZ = 0
AngleX = 0
AngleY = 0
AngleZ = 0
ARot = False
PivX = 0
PivY = 0
PivZ = 0
Dim X (8)
Dim Y (8)
Dim Z (8)
Dim TX (8)
Dim TY (8)
I = 60
For j = 1 To 8
X (j) = I * IIf(j>4,-1,1)
Y (j) = I * IIf((j Mod 4)>1,-1,1)
Z (j) = I * IIf((j Mod 2),-1,1)
Next j
Repeat
For N = 1 To 8
XD = X (N) - PivX
YD = Y (N) - PivY
ZD = Z (N) - PivZ
ZX = XD*Cos(ANGLEZ) - YD*Sin(ANGLEZ) - XD
ZY = XD*Sin(ANGLEZ) + YD*Cos(ANGLEZ) - YD
YX = (XD+ZX)*Cos(AngleY) - ZD*Sin(AngleY) - (XD+ZX)
YZ = (XD+ZX)*Sin(AngleY) + ZD*Cos(AngleY) - ZD
XY = (YD+ZY)*Cos(AngleX) - (ZD+YZ)*Sin(AngleX) - (YD+ZY)
XZ = (YD+ZY)*Sin(AngleX) + (ZD+YZ)*Cos(AngleX) - (ZD+YZ)
XROTOFFSET = YX+ZX
YROTOFFSET = ZY+XY
ZROTOFFSET = XZ+YZ
If Mode = 0 Then
SX = ( X (N) + XROTOFFSET + CamX ) / Scale + MoveX
SY = ( Y (N) + YROTOFFSET + CamY ) / Scale + MoveY
Else
SZ = ( Z (N) + ZROTOFFSET + CamZ )
SX = ( X (N) + XROTOFFSET + CamX ) / SZ / Scale + MoveX
SY = ( Y (N) + YROTOFFSET + CamY ) / SZ / Scale + MoveY
EndIf
Color cbWhite
If Mode = 0 Then
If Not DMode Then
Circle SX + 400, SY + 300, Size / Scale
Else
TX (N-1) = SX + 400
TY (N-1) = SY + 300
EndIf
Else
PZ = (Z (N) + ZROTOFFSET + CamZ)
Circle SX + 400, SY + 300, Size / PZ / Scale
PX = ( ( PivX + CamX ) / ( PivZ + CamZ ) ) / Scale + MoveX + 400
PY = ( ( PivY + CamY ) / ( PivZ + CamZ ) ) / Scale + MoveY + 300
Dot PX, PY
EndIf
Next N
FG = 1 + (KeyDown(cbkeylcontrol) * 3)
If KeyDown(cbKeyLeft) Then MoveX = MoveX - (2 * FG)
If KeyDown(cbKeyRight) Then MoveX = MoveX + (2 * FG)
If KeyDown(cbKeyUp) Then MoveY = MoveY - (2 * FG)
If KeyDown(cbKeyDown) Then MoveY = MoveY + (2 * FG)
If KeyDown(cbKeyO) Then Scale# = Scale# * 1.02
If KeyDown(cbKeyP) Then Scale# = Scale# / 1.02
If KeyDown(cbKeyQ) Then AngleY = AngleY - FG
If KeyDown(cbKeyE) Then AngleY = AngleY + FG
If KeyDown(cbKeyW) Then AngleX = AngleX - FG
If KeyDown(cbKeyS) Then AngleX = AngleX + FG
If KeyDown(cbKeyA) Then AngleZ = AngleZ - FG
If KeyDown(cbKeyD) Then AngleZ = AngleZ + FG
If KeyDown(cbKeyF) Then PivX = PivX - (2 * FG)
If KeyDown(cbKeyH) Then PivX = PivX + (2 * FG)
If KeyDown(cbKeyT) Then PivY = PivY - (2 * FG)
If KeyDown(cbKeyG) Then PivY = PivY + (2 * FG)
If KeyDown(cbKeyR) Then PivZ = PivZ - (2 * FG)
If KeyDown(cbKeyY) Then PivZ = PivZ + (2 * FG)
If KeyDown(cbKey1) Then CamX = CamX - (4 * FG)
If KeyDown(cbKey2) Then CamX = CamX + (4 * FG)
If KeyDown(cbKey3) Then CamY = CamY - (4 * FG)
If KeyDown(cbKey4) Then CamY = CamY + (4 * FG)
If KeyDown(cbKey5) Then CamZ = CamZ - (4 * FG)
If KeyDown(cbKey6) Then CamZ = CamZ + (4 * FG)
If ARot Then AngleY = AngleY + FG
If ARot Then AngleX = AngleX - FG
If ARot Then AngleZ = AngleZ - FG
If DMode Then
Color 128, 128, 128
Line TX (4), TY (4), TX (2), TY (2)
Line TX (0), TY (0), TX (7), TY (7)
Line TX (0), TY (0), TX (1), TY (1)
Line TX (2), TY (2), TX (3), TY (3)
Line TX (4), TY (4), TX (5), TY (5)
Line TX (7), TY (7), TX (6), TY (6)
Line TX (0), TY (0), TX (6), TY (6)
Line TX (4), TY (4), TX (3), TY (3)
Line TX (2), TY (2), TX (5), TY (5)
Line TX (7), TY (7), TX (1), TY (1)
Line TX (3), TY (3), TX (5), TY (5)
Line TX (6), TY (6), TX (1), TY (1)
Color 255, 255, 255
Line TX (0), TY (0), TX (4), TY (4)
Line TX (0), TY (0), TX (2), TY (2)
Line TX (4), TY (4), TX (7), TY (7)
Line TX (2), TY (2), TX (6), TY (6)
Line TX (0), TY (0), TX (3), TY (3)
Line TX (3), TY (3), TX (1), TY (1)
Line TX (2), TY (2), TX (1), TY (1)
Line TX (4), TY (4), TX (6), TY (6)
Line TX (7), TY (7), TX (5), TY (5)
Line TX (6), TY (6), TX (5), TY (5)
Line TX (3), TY (3), TX (7), TY (7)
Line TX (1), TY (1), TX (5), TY (5)
EndIf
If KeyHit(cbKeySpace) Then
If Mode = 0 Then
Mode = 1
Scale# = Scale# / CamZ
Else
Mode = 0
Scale# = Scale# * CamZ
EndIf
EndIf
If KeyHit(cbKeyReturn) Then
ARot = Not ARot
EndIf
If KeyHit(cbKeyBackspace) Then
DMode = Not DMode
EndIf
DrawScreen
Forever