summaryrefslogtreecommitdiff
path: root/stern.bas
blob: ee19d1b58af99b04899dcff8124bc255982d6576 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
'$Id$
'STERN.BAS 29.04.1996

DECLARE SUB InitProgram ()
DECLARE SUB MainLoop ()
DECLARE SUB Calc3D ()
DECLARE SUB Rotation ()
DECLARE SUB DrawObject ()

DIM SHARED Lines, World(500, 3)
DIM SHARED X, Y, Z, sX, sY, Xa, Ya, Za, sXs, sYs, D
DIM SHARED R1, R2, R3, Sr1, Sr2, Sr3, Cr1, Cr2, Cr3, mX, mY, mZ

    READ Lines
    FOR i = 1 TO Lines
        FOR J = 1 TO 3
            READ World(i, J)
        NEXT
    NEXT

    InitProgram
    MainLoop
    SCREEN 0
END

DATA 72
DATA  90,  0,  0,   10, 10, 10,     90,  0,  0,   10, 10,-10
DATA  90,  0,  0,   10,-10,-10,     90,  0,  0,   10,-10, 10
DATA -90,  0,  0,  -10, 10, 10,    -90,  0,  0,  -10, 10,-10
DATA -90,  0,  0,  -10,-10,-10,    -90,  0,  0,  -10,-10, 10
DATA   0, 90,  0,   10, 10, 10,      0, 90,  0,  -10, 10, 10
DATA   0, 90,  0,  -10, 10,-10,      0, 90,  0,   10, 10,-10
DATA   0,-90,  0,   10,-10, 10,      0,-90,  0,  -10,-10, 10
DATA   0,-90,  0,  -10,-10,-10,      0,-90,  0,   10,-10,-10
DATA   0,  0, 90,   10, 10, 10,      0,  0, 90,   10,-10, 10
DATA   0,  0, 90,  -10,-10, 10,      0,  0, 90,  -10, 10, 10
DATA   0,  0,-90,   10, 10,-10,      0,  0,-90,   10,-10,-10
DATA   0,  0,-90,  -10,-10,-10,      0,  0,-90,  -10, 10,-10
DATA  10, 10, 10,  -10, 10, 10,     10,-10, 10,  -10,-10, 10
DATA  10, 10,-10,  -10, 10,-10,     10,-10,-10,  -10,-10,-10
DATA  10, 10, 10,   10,-10, 10,    -10, 10, 10,  -10,-10, 10
DATA  10, 10,-10,   10,-10,-10,    -10, 10,-10,  -10,-10,-10
DATA  10, 10, 10,   10, 10,-10,     10,-10, 10,   10,-10,-10
DATA -10,-10, 10,  -10,-10,-10,    -10, 10, 10,  -10, 10,-10

SUB Calc3D
    X  = -1 * X
    Xa = Cr1 * X - Sr1 * Z
    Za = Sr1 * X + Cr1 * Z
    X  = Cr2 * Xa + Sr2 * Y
    Ya = Cr2 * Y - Sr2 * Xa
    Z  = Cr3 * Za - Sr3 * Ya
    Y  = Sr3 * Za + Cr3 * Ya
    X  = X + mX
    Y  = Y + mY
    Z  = Z + mZ
    sX = D * X / Z
    sY = D * Y / Z
END SUB

SUB DrawObject
    Rotation
    FOR i = 1 TO Lines STEP 2
        X = World(i, 1)
        Y = World(i, 2)
        Z = World(i, 3)
        Calc3D
        sXs = sX: sYs = sY

        X = World(i + 1, 1)
        Y = World(i + 1, 2)
        Z = World(i + 1, 3)
        Calc3D

        LINE (sXs, sYs)-(sX, sY), 15
    NEXT
END SUB

SUB InitProgram
    SCREEN 9, 1, 0, 1
    WINDOW (-320, -175)-(320, 175)
    CLS                    'PAGE 0

    SCREEN 9, 1, 1, 0
    CLS                    'PAGE 1

    D  = 1200      'View point and rotation values
    mZ = -850
    mX = -5
    R1 = 0
    R2 = 0
    R3 = .3
END SUB

SUB MainLoop
    WHILE INKEY$ = ""
       R1 = R1 + .1: IF R1 > 6.28 THEN R1 = 0
       R2 = R1: R3 = R1

       WAIT 986, 8
       CLS : DrawObject
       Page = ABS(Page = 0)         'Page switching is used to hide the drawing
       SCREEN 9, 1, 1 - Page, Page  'process so the image looks smooth.
    WEND
END SUB

SUB Rotation
    Sr1 = SIN(R1)
    Sr2 = SIN(R2)
    Sr3 = SIN(R3)
    Cr1 = COS(R1)
    Cr2 = COS(R2)
    Cr3 = COS(R3)
END SUB