From ed807f95a76e43594a88a763748d0551a3fcf05e Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 22 Sep 2003 07:41:21 +0000 Subject: simple vectorgrphic a la 3D (DOS) --- egavga.bgi | Bin 0 -> 5554 bytes stern.bas | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ stern.cpp | 126 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 240 insertions(+) create mode 100644 egavga.bgi create mode 100644 stern.bas create mode 100644 stern.cpp diff --git a/egavga.bgi b/egavga.bgi new file mode 100644 index 0000000..1771336 Binary files /dev/null and b/egavga.bgi differ diff --git a/stern.bas b/stern.bas new file mode 100644 index 0000000..4c3da70 --- /dev/null +++ b/stern.bas @@ -0,0 +1,114 @@ +'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 + diff --git a/stern.cpp b/stern.cpp new file mode 100644 index 0000000..c94f449 --- /dev/null +++ b/stern.cpp @@ -0,0 +1,126 @@ +// STERN.CPP 11.02.2000 +#include +#include +#include +#include +#include + +void InitProgram(void); +void MainLoop(void); +void Calc3D(void); +void Rotation(void); +void DrawObject(void); + +#define COPYRIGHT "Dark Alliance (c) 1996-2000 DreamDemon" +#define Lines 72 +static int World[Lines][3] = { + 90, 0, 0, 10, 10, 10, 90, 0, 0, 10, 10,-10, + 90, 0, 0, 10,-10,-10, 90, 0, 0, 10,-10, 10, + -90, 0, 0, -10, 10, 10, -90, 0, 0, -10, 10,-10, + -90, 0, 0, -10,-10,-10, -90, 0, 0, -10,-10, 10, + 0, 90, 0, 10, 10, 10, 0, 90, 0, -10, 10, 10, + 0, 90, 0, -10, 10,-10, 0, 90, 0, 10, 10,-10, + 0,-90, 0, 10,-10, 10, 0,-90, 0, -10,-10, 10, + 0,-90, 0, -10,-10,-10, 0,-90, 0, 10,-10,-10, + 0, 0, 90, 10, 10, 10, 0, 0, 90, 10,-10, 10, + 0, 0, 90, -10,-10, 10, 0, 0, 90, -10, 10, 10, + 0, 0,-90, 10, 10,-10, 0, 0,-90, 10,-10,-10, + 0, 0,-90, -10,-10,-10, 0, 0,-90, -10, 10,-10, + 10, 10, 10, -10, 10, 10, 10,-10, 10, -10,-10, 10, + 10, 10,-10, -10, 10,-10, 10,-10,-10, -10,-10,-10, + 10, 10, 10, 10,-10, 10, -10, 10, 10, -10,-10, 10, + 10, 10,-10, 10,-10,-10, -10, 10,-10, -10,-10,-10, + 10, 10, 10, 10, 10,-10, 10,-10, 10, 10,-10,-10, + -10,-10, 10, -10,-10,-10, -10, 10, 10, -10, 10,-10}; + +float X, Y, Z, sX, sY, Xa, Ya, Za, sXs, sYs, D, Page; +float R1, R2, R3, Sr1, Sr2, Sr3, Cr1, Cr2, Cr3, mX, mY, mZ; + +void main(void) +{ + InitProgram(); + MainLoop(); + closegraph(); + printf("%s\n",COPYRIGHT); + getch(); +} + +void Calc3D(void) +{ + 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 = 320 + D * X / Z; + sY = 175 + D * Y / Z; +} + +void DrawObject(void) +{ + int i; + + Rotation(); + for(i=0; i 6.28) R1 = 0; + R2 = R1; + R3 = R1; + clearviewport(); + DrawObject(); + (Page == 0)? Page = 1: Page = 0; + setactivepage(1-Page); + setvisualpage(Page); + } +} + +void Rotation(void) +{ + Sr1 = sin(R1); + Sr2 = sin(R2); + Sr3 = sin(R3); + Cr1 = cos(R1); + Cr2 = cos(R2); + Cr3 = cos(R3); +} -- cgit v1.2.3