54 lines
1.6 KiB
Text
54 lines
1.6 KiB
Text
PROGRAM SPHERE
|
|
|
|
CONST SHADES$=".:!*oe&#%@"
|
|
|
|
DIM LIGHT[2],X[2],Y[2],V[2],VEC[2]
|
|
|
|
PROCEDURE DOT(X[],Y[]->D)
|
|
D=X[0]*Y[0]+X[1]*Y[1]+X[2]*Y[2]
|
|
IF D<0 THEN D=-D ELSE D=0 END IF
|
|
END PROCEDURE
|
|
|
|
PROCEDURE NORMALIZE(V[]->V[])
|
|
LUNG=SQR(V[0]*V[0]+V[1]*V[1]+V[2]*V[2])
|
|
V[0]=V[0]/LUNG
|
|
V[1]=V[1]/LUNG
|
|
V[2]=V[2]/LUNG
|
|
END PROCEDURE
|
|
|
|
PROCEDURE PDRAW(R,K,AMBIENT)
|
|
FOR I=INT(-R) TO INT(R) DO
|
|
X=I+0.5
|
|
FOR J=INT(-2*R) TO INT(2*R) DO
|
|
Y=J/2+0.5
|
|
IF (X*X+Y*Y<=R*R) THEN
|
|
VEC[0]=X
|
|
VEC[1]=Y
|
|
VEC[2]=SQR(R*R-X*X-Y*Y)
|
|
NORMALIZE(VEC[]->VEC[])
|
|
DOT(LIGHT[],VEC[]->D)
|
|
B=D^K+AMBIENT
|
|
INTENSITY%=(1-B)*(LEN(SHADES$)-1)
|
|
IF (INTENSITY%<0) THEN INTENSITY%=0 END IF
|
|
IF (INTENSITY%>=LEN(SHADES$)-1) THEN
|
|
INTENSITY%=LEN(SHADES$)-2
|
|
END IF
|
|
PRINT(#1,MID$(SHADES$,INTENSITY%+1,1);)
|
|
ELSE
|
|
PRINT(#1,(" ");)
|
|
END IF
|
|
END FOR
|
|
PRINT(#1,)
|
|
END FOR
|
|
END PROCEDURE
|
|
|
|
BEGIN
|
|
LIGHT[]=(30,30,-50)
|
|
OPEN("O",1,"SPHERE.PRN")
|
|
NORMALIZE(LIGHT[]->LIGHT[])
|
|
PDRAW(10,2,0.4)
|
|
|
|
PRINT(#1,STRING$(79,"="))
|
|
PDRAW(20,4,0.1)
|
|
CLOSE(1)
|
|
END PROGRAM
|