Mark's Coding Creations
Gouraud Quads
Home
Kaleidascope
Gouraud Ellipses
Gouraud Quads
Gouraud Triangles
Draw And Fill
Gouraud_Circles
Rotate Image

gouraud_quads2.jpg

REM Project: Vector_Quad
REM Created: 13.1.2007 16:17:21
REM Author:  Mark Garrett  aka 'bubba'
REM ***** Main Source File *****
REM
global r5:global g5: global b5

global dim x(4000)
global dim y(4000)
global dim r(4000)
global dim g(4000)
global dim b(4000)

global  n1
global  n2
set display mode 1024,768,16
 sync on:sync rate 0

`------------------------ set up primary colors:
dim culur(6)
culur(1) = rgb(255,0,0):culur(2) = rgb(0,255,0):culur(3) = rgb(0,0,255)
culur(4) = rgb(255,255,0):culur(5) = rgb(0,255,255):culur(6) = rgb(255,0,255)
 
for m = 1 to 20
lock pixels
cc = rnd(5)+1 :color1 = culur(cc)
cc1: cc = rnd(5)+1 :color2 = culur(cc)
if color2 = color1 then goto cc1
cc2: cc = rnd(5)+1 :color3 = culur(cc)
if color3 = color1 or color3 = color2 then goto cc2
cc3: cc = rnd(5)+1 :color4 = culur(cc)
if color4 = color1 or color4 = color2 or color4 = color3 then goto cc3
 
 
Quad(rnd(400),rnd(350),color1,rnd(300)+700,rnd(300),color2,rnd(300)+700,rnd(300)+400,color3,rnd(400),rnd(300)+400,color4)
`Quad(10,10,color1,500,10,color2,400,400,color3,20,600,color4)
unlock pixels:sync
next m
 ink rgb(0,255,255),0
 text 10,10," To save a j-peg file press the right mouse button.  "
 text 10,25," to exit press the left mouse button."  :sync
wait mouse   `observe results
 if mouseclick() = 2
  get image 1,0,0,1023,767,1: save image "Gouraud_Quads.jpg",1 :wait 5000
  endif
end          `exit

`&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
function Quad(x11,y11,color11,x22,y22,color22,x33,y33,color33,x44,y44,color44)
global n
global r5:global g5: global b5

global dim x(4000)
global dim y(4000)
global dim r(4000)
global dim g(4000)
global dim b(4000)

global  n1
global  n2
`-------------  get x_mid,y_mid ---------------------------
Point1 = (x11 + x22)/2: Point2 = (x22 + x33)/2: Point3 = (x33+x44)/2  : Point4 = (x44+x11)/2
   x_MID = (Point1 + Point2 + Point3 + Point4)/4
   Point1 = (y11 + y22)/2: Point2 = (y22 + y33)/2: Point3 = (y33+y44)/2 : Point4 = (y44+y11)/2
   y_MID = (Point1 + Point2 + Point3 + Point4)/4
 
 
  `text x11,y11, "1"  :text x22,y22, "2":text x33,y33, "3" :text x44,y44, "4"
`----------------------------------------------------------
`
x1 as float:x2 as float:y1 as float:y2 as float:c1 as float:c2 as float
 
x1 = x11:y1 = y11:x2 = x22:y2 = y22
c1 = color11:c2 = color22 :gosub Poke_a_Side `: mid_side_1 = long_span/2
co2 = n     `(corner 2)

x1 = x22:y1 = y22:x2 = x33:y2 = y33
c1 = color22:c2 = color33 :  gosub Poke_a_Side
co3 = n

x1 = x33:y1 = y33:x2 = x44:y2 = y44
c1 = color33:c2 = color44 :  gosub Poke_a_Side
co4 = n

x1 = x44:y1 = y44:x2 = x11:y2 = y11
c1 = color44:c2 = color11 :  gosub Poke_a_Side
co1 = n
goto draw_vertices
 

Poke_a_Side:
`-----------------get add----xy's -and largest-span
spany as float: spanx as float:addx as float:addy as float:long_span as float
`- - - - - - - - - -
 spanx = abs(x2-x1)
 spany = abs(y2-y1)
if spany>=spanx then long_span = spany
if spanx>=spany then long_span = spanx
addy = (y2-y1)/long_span
addx = (x2-x1)/long_span
`-----------------get add---rgb's
r1 as float:g1 as float:b1 as float:r2 as float:g2 as float:b2 as float
rspan as float:gspan as float:bspan as float
addr as float:addg as float:addb as float
`- - - - - - - - - - -
r1 = rgbr(c1):g1 = rgbg(c1):b1 = rgbb(c1)
r2 = rgbr(c2):g2 = rgbg(c2):b2 = rgbb(c2)

addr = (r2-r1)/long_span
addg = (g2-g1)/long_span
addb = (b2-b1)/long_span
 

`---------------poke-a-side-of-the-quad-
for t = 1 to long_span
 
x1 = x1 + addx: x(n) = x1
y1 = y1 + addy: y(n) = y1

last_y1 = y1:last_x1 = x1
r1 = r1 + addr: r(n) = r1
g1 = g1 + addg: g(n) = g1
b1 = b1 + addb: b(n) = b1

cont:
ink rgb(r1,g1,b1),0  : dot x1,y1
`print x1, y1
inc n
next t
RETURN
`                             DRAW  vertices
 `MMMMMMMMMMMMMMMMMMMMMMMMMMM                   MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
 `MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
`---------------------------- draw vertices----------------------
draw_vertices:
 
if y11 <= y22    and y11 <= y33    and y11 <= y44    then Hi_y = co1
if y22 <= y11    and y22 <= y33    and y22 <= y44    then Hi_y = co2
if y33 <= y11    and y33 <= y22    and y33 <= y44    then Hi_y = co3
if y44 <= y11    and y44 <= y22    and y44 <= y33    then Hi_y = co4

if y11 >= y22    and y11 >= y33    and y11 >= y44    then Lo_y = co1
if y22 >= y11    and y22 >= y33    and y22 >= y44    then Lo_y = co2
if y33 >= y11    and y33 >= y22    and y33 >= y44    then Lo_y = co3
if y44 >= y11    and y44 >= y22    and y44 >= y33    then Lo_y = co4
n1 = Hi_y     : n2 =    Hi_y

beggin_LOOP:
n1 = I(n1,1)
n2 = D(n2,1)
n1y = y(n1)
n2y = y(n2)

if n2y > n1y then n2 = I(n2,1): goto beggin_LOOP
if n1y > n2y then n1 = D(n1,1): goto beggin_LOOP
 
if y(n2) = y(Lo_y) 
undim x(0): undim y(0): undim r(0): undim g(0)
undim b(0): exitfunction
endif
 
gosub Poke_a_line
goto beggin_LOOP
`++++++++++++++++++++++++++++ POKE A LINE ++++++++++++++++++++++++++++++++++++
`++++++++++++++++++++++++++++ POKE A LINE ++++++++++++++++++++++++++++++++++++
`++++++++++++++++++++++++++++ POKE A LINE ++++++++++++++++++++++++++++++++++++
Poke_a_line:
`-----------------get add----xy's -and largest-span
`- - - - - - - - - -
 spanx = abs(x(n2)-x(n1))
 spany = abs(y(n2)-y(n1))
if spany>=spanx then long_span = spany
if spanx>=spany then long_span = spanx
addy = (y(n1)-y(n2))/long_span
y2 = y(n2)    ` for poking the dots
addx = (x(n1)-x(n2))/long_span
x2 = x(n2)

r1 = r(n1):g1 = g(n1):b1 = b(n1)
r2 = r(n2):g2 = g(n2):b2 = b(n2)

addr = (r1-r2)/long_span
addg = (g1-g2)/long_span
addb = (b1-b2)/long_span
`----------------prepare-storage-space

`---------------
for tu = 1 to long_span-1

`inc n
x2 = x2 + addx
y2 = y2 + addy
 

r2 = r2 + addr
g2 = g2 + addg
b2 = b2 + addb

ink rgb(r2,g2,b2),0
dot x2,y2
dot x2,y2+1
dot x2+1,y2 `:dot x2-1,y2
`line x(n2),y(n2),x(n1),y(n1)
next tu
RETURN

`print "  ": print "  "
`print x(n2),"  ",y(n2),"  ",   x(n1),"  ",y(n1)
`print "Hi_y   ", Hi_y
`print "n1  ",n1, "  n2  ", n2
`print "n  ",n
`print "co1  ",co1
`print "co2  ",co2
`print "co3  ",co3
`print "co4  ",co4
`print "D(co4,1)  ",D(c4,1)
`print "Hi_y   ",Hi_y
`print "y(Hi_y)  ",y(Hi_y)
`exitfunction
 
endfunction
 

 `                              SUPPORTING  FUNCTIONS
 `&&&&&&&&&&&&&&&&&&&&&&&&&&&&    FUNCTIONS  &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
 `&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
 `&&&&&&&&&&&&&&&&&&&&&&&& INC &&&&&&&&&&&&&&&&&&&&&&&&&&&
function I(value as integer,times)
for t = 1 to times
if value+1 > n then value = 0
inc value
next t
endfunction value
`&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
 `&&&&&&&&&&&&&&&&&&&&&&&&&& DEC  &&&&&&&&&&&&&&&&&&&&&&&&&

 function D(value,times)
for t = 1 to times
if value - 1 < 1 then value = n
dec value
next t
endfunction value
`&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
`&&&&&&&&&&&&&&&&&&&&&&&&&&&  INT_ &&&&&&&&&&&&&&&&&&&&&
function int_(value as float)
a# = int(value+1): a# = a# - value
b# = int(value)  : b# = value - b#
if a# > b# then true_intuger_value = int(value)
if b# > a# then true_intuger_value = int(value+1)
if b# = a# then true_intuger_value = int(value+1)
endfunction true_intuger_value
`&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
`&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&