WindowWidth = DisplayWidth
WindowHeight = DisplayHeight
global winx , winy , pi
winx = WindowWidth
winy = WindowHeight
global black , red , green , yellow
global blue , magenta , cyan , white
global pink , purple , gray , orange
dim m( 26 * 4 * 4 ) , pnt( 256 , 2 ) , tri( 1000 , 13 ) , ry( 1000 )
for i = 1 to 1000
ry( i ) = i
next i
global t.x1,t.y1,t.z1,t.x2,t.y2,t.z2,t.x3,t.y3,t.z3,t.kl
global t.lx,t.ly,t.lz
global tritel
t.x1 = 0
t.y1 = 1
t.z1 = 2
t.x2 = 3
t.y2 = 4
t.z2 = 5
t.x3 = 6
t.y3 = 7
t.z3 = 8
t.kl = 9
t.lx = 10
t.ly = 11
t.lz = 12
pi = atn( 1 ) * 4
black = rgb( 0 , 0 , 0 )
red = rgb( 255 , 0 , 0 )
green = rgb( 0 , 255 , 0 )
yellow = rgb( 255 , 255 , 0 )
blue = rgb( 0 , 0 , 255 )
magenta = rgb( 255 , 0 , 255 )
cyan = rgb( 0 , 255 , 255 )
white = rgb( 255 , 255 , 255 )
pink = rgb( 255 , 127 , 127 )
orange = rgb( 255 , 127 , 0 )
gray = rgb( 127 , 127 , 127 )
purple = rgb( 127 , 0 , 127 )
nomainwin
global frame
open "triangle" for graphics as #m
#m "trapclose [quit]"
timer 250 , [tmr]
wait
[tmr]
scan
#m "fill black"
tritel = 0
call link 1 , 0,0,0 , frame,frame,0 , 0 , 0
call setpoint 0 , -100 , -100 , -100
call setpoint 1 , -100 , -100 , -100
call setpoint 2 , -100 , -100 , -100
call setpoint 3 , -100 , -100 , -100
call d3 0 , 1 , 2 , red
call d3 0 , 1 , 3 , blue
call d3 0 , 2 , 3 , green
call d3 1 , 2 , 3 , yellow
call drawall
wait
'' graphics
sub drawall
for h = 1 to tritel - 1
for l = 0 to h
if tri( ry( h ) , t.lz ) < tri( ry( l ) , t.lz ) then
q = ry( h )
ry( h ) = ry( l )
ry( l ) = q
end if
next l
next h
for i = 0 to tritel - 1
x1 = tri( ry( i ) , t.x1 )
y1 = tri( ry( i ) , t.y1 )
z1 = tri( ry( i ) , t.z1 )
x2 = tri( ry( i ) , t.x2 )
y2 = tri( ry( i ) , t.y2 )
z2 = tri( ry( i ) , t.z2 )
x3 = tri( ry( i ) , t.x3 )
y3 = tri( ry( i ) , t.y3 )
z3 = tri( ry( i ) , t.z3 )
kl = tri( ry( i ) , t.kl )
lx = tri( ry( i ) , t.lx )
ly = tri( ry( i ) , t.ly )
lz = tri( ry( i ) , t.lz )
a1 = winx / 2 + x1 / ( z1 + 1000 ) * 1000
b1 = winy / 2 - y1 / ( z1 + 1000 ) * 1000
a2 = winx / 2 + x2 / ( z2 + 1000 ) * 1000
b2 = winy / 2 - y2 / ( z2 + 1000 ) * 1000
a3 = winx / 2 + x3 / ( z3 + 1000 ) * 1000
b3 = winy / 2 - y3 / ( z3 + 1000 ) * 1000
call triangle a1 , b1 , a2 , b2 , a3 , b3 , kl
next i
#m "flush"
end sub
sub setpoint no , x , y , z
if no < 0 or no > 255 then exit sub
call spot x , y , z
pnt( no , 0 ) = x
pnt( no , 1 ) = y
pnt( no , 2 ) = z
end sub
sub d3 p1 , p2 , p3 , kl
if tritel >= 1000 then exit sub
tri( tritel , t.x1 ) = pnt( p1 , 0 )
tri( tritel , t.y1 ) = pnt( p1 , 1 )
tri( tritel , t.z1 ) = pnt( p1 , 2 )
tri( tritel , t.x2 ) = pnt( p2 , 0 )
tri( tritel , t.y2 ) = pnt( p2 , 1 )
tri( tritel , t.z2 ) = pnt( p2 , 2 )
tri( tritel , t.x3 ) = pnt( p3 , 0 )
tri( tritel , t.y3 ) = pnt( p3 , 1 )
tri( tritel , t.z3 ) = pnt( p3 , 2 )
tri( tritel , t.kl ) = kl
z = ( pnt( p1, 2 ) + pnt( p2 , 2 ) + pnt( p3 , 2 ) ) / 3
tri( tritel , t.led.z ) = z
tritel = tritel + 1
end sub
sub triangle x1 , y1 , x2 , y2 , x3 , y3 , clr
call setcolor clr
if y1 = y2 then y1 = y1 - 1e-10
if y2 = y3 then y3 = y3 + 1e-10
if y1 > y3 then
call swap y1 , y3
call swap x1 , x3
end if
if y1 > y2 then
call swap y1 , y2
call swap x1 , x2
end if
if y2 > y3 then
call swap y2 , y3
call swap x2 , x3
end if
for i = y1 to y3
a = x1 + ( x3 - x1 ) * (i-y1) / ( y3 - y1 )
if i < y2 then
b = x1 + ( x2 - x1 ) * (i-y1) / ( y2 - y1 )
else
b = x2 + ( x3 - x2 ) * (i-y2) / ( y3 - y2 )
end if
#m "down"
#m "line " ; a ; " " ; i ; " " ; b ; " " ; i
#m "up"
next i
end sub
sub swap byref a , byref b
h = a : a = b : b = h
end sub
[quit]
close #m
end
'' color
sub setcolor clr
r = clr and 255
g = int( clr / 256 ) and 255
b = int( clr / 256 ^ 2 ) and 255
#m "color " ; r ; " " ; g ; " " ; b
#m "backcolor " ; r ; " " ; g ; " " ; b
end sub
function rainbow( deg )
rainbow = rgb( sin( rad( deg ) ) * 127 + 128 _
, sin( rad( deg - 120 ) ) * 127 + 128 _
, sin( rad( deg + 120 ) ) * 127 + 128 )
end function
function rgb( r , g , b )
rgb = ( r and 255 ) _
+ ( g and 255 ) * 256 _
+ ( b and 255 ) * 256 * 256
end function
function mix( kl1 , f , kl2 )
r1 = int( kl1 and 255 )
g1 = int( kl1 / 256 ) and 255
b1 = int( kl1 / 256 / 256 ) and 255
r2 = int( kl2 and 255 )
g2 = int( kl2 / 256 ) and 255
b2 = int( kl2 / 256 / 256 ) and 255
r = r1 + ( r2 - r1 ) * f
g = g1 + ( g2 - g1 ) * f
b = b1 + ( b2 - b1 ) * f
mix = rgb( r , g , b )
end function
'' math
function rad( deg )
rad = deg * pi / 180
end function
function lenght( x , y , z )
lenght = sqr( x^2 + y^2 + z^2 )
end function
function dot( x1 , y1 , z1 , x2 , y2 , z2 )
dot = x1 * x2 + y1 * y2 + z1 * z2
end function
function angle( x , y , z , a , b , c )
l1 = lenght( x , y , z )
l2 = lenght( a , b , c )
d = dot( x , y , z , a , b , c )
angle = acs( d / ( l1 * l2 ) )
end function
'' 3D engine
sub link no , x , y , z , xz , yz , xy , ax , p
if no < 1 or no > 20 then exit sub
if p < 0 or p > 20 then exit sub
if no = p then exit sub
call copy 0 , rotx
call copy 0 , roty
call copy 0 , rotz
call copy 0 , trans
m( in( rotx , 1 , 1 ) ) = cos( rad( yz ) )
m( in( rotx , 1 , 2 ) ) = 0-sin( rad( yz ) )
m( in( rotx , 2 , 1 ) ) = sin( rad( yz ) )
m( in( rotx , 2 , 2 ) ) = cos( rad( yz ) )
m( in( roty , 0 , 0 ) ) = cos( rad( xz ) )
m( in( roty , 0 , 2 ) ) = 0-sin( rad( xz ) )
m( in( roty , 2 , 0 ) ) = sin( rad( xz ) )
m( in( roty , 2 , 2 ) ) = cos( rad( xz ) )
m( in( rotz , 0 , 0 ) ) = cos( rad( xy ) )
m( in( rotz , 0 , 1 ) ) = 0-sin( rad( xy ) )
m( in( rotz , 1 , 0 ) ) = sin( rad( xy ) )
m( in( rotz , 1 , 1 ) ) = cos( rad( xy ) )
m( in( trans , 3 , 0 ) ) = x
m( in( trans , 3 , 1 ) ) = y
m( in( trans , 3 , 2 ) ) = z
select case ax
case xyz
call keer rotx , roty , rotz , no
case xzy
call keer rotx , rotz , roty , no
case yxz
call keer roty , rotx , rotz , no
case yzx
call keer roty , rotz , rotx , no
case zxy
call keer rotz , rotx , roty , no
case zyx
call keer rotz , roty , rotx , no
case else
call keer rotx , roty , rorz , no
end select
number = no
end sub
sub keer a , b , c , no
call maal a , b , temp
call maal temp , c , no
call maal no , trans , temp
call maal temp , p , no
end sub
function in( no , x , y )
in = no * 16 + x * 4 + y
end function
sub copy a , uit
for i = 0 to 3
for j = 0 to 3
m( in( uit , i , j ) ) = m( in( a , i , j ) )
next j
next i
end sub
sub maal a , b , uit
for i = 0 to 3
for j = 0 to 3
m( in( uit , i , j ) ) = 0
for k = 0 to 3
m( in( uit , i , j ) ) = m( in( uit , i , j ) ) _
+ m( in( a , i , k ) ) * m( in( b , k , j ) )
next k
next j
next i
end sub
sub spot byref x , byref y , byref z
no = number
hx = m( in( no , 0 , 0 ) ) * x _
+ m( in( no , 1 , 0 ) ) * y _
+ m( in( no , 2 , 0 ) ) * z _
+ m( in( no , 3 , 0 ) )
hy = m( in( no , 0 , 1 ) ) * x _
+ m( in( no , 1 , 1 ) ) * y _
+ m( in( no , 2 , 1 ) ) * z _
+ m( in( no , 3 , 1 ) )
hz = m( in( no , 0 , 2 ) ) * x _
+ m( in( no , 1 , 2 ) ) * y _
+ m( in( no , 2 , 2 ) ) * z _
+ m( in( no , 3 , 2 ) )
x = hx
y = hy
z = hz
end sub