Alrighty, the first test is finnished...a quadratic bezier curve calculator.
` #########################
` Quadratic Bezier Curve
` v.0.1
` An Experiment for Imple-
` mentation of Rail Systems
` By Chris Martindale
` #########################
set display mode 800,600,32
sync on : sync rate 60
` constants
true = 1 : false = 0
black = rgb(0,0,0) : white = rgb(255,255,255) : red = rgb(255,0,0)
segmentstepincrease# = 0.005
` point - x,y
dim basepoint#(3,2)
dim bezierpoint#(1,2)
` vector - length,angle
dim basevector#(2,2)
dim quadpoint#(2,2)
dim quadvector#(1,2)
dim curve#(1000,2)
` setup point positions
basepoint#(1,1) = 100 : basepoint#(1,2) = 500
basepoint#(2,1) = 400 : basepoint#(2,2) = 50
basepoint#(3,1) = 700 : basepoint#(3,2) = 400
quadpoint#(1,1) = basepoint#(1,1) : quadpoint#(1,2) = basepoint#(1,2)
quadpoint#(2,1) = basepoint#(2,1) : quadpoint#(2,2) = basepoint#(2,2)
` setup vectors
basevector#(1,1) = distance(basepoint#(1,1),basepoint#(1,2),basepoint#(2,1),basepoint#(2,2))
basevector#(1,2) = angle2d(basepoint#(1,1),basepoint#(1,2),basepoint#(2,1),basepoint#(2,2))
basevector#(2,1) = distance(basepoint#(2,1),basepoint#(2,2),basepoint#(3,1),basepoint#(3,2))
basevector#(2,2) = angle2d(basepoint#(2,1),basepoint#(2,2),basepoint#(3,1),basepoint#(3,2))
quadvector#(1,1) = basevector#(1,1) : quadvector#(1,2) = basevector#(1,2)
` initializations
segmentstep# = 0.00
` driver loop __________________________________________________
repeat
` calculate quad vectors
for pointnum = 1 to 2
` quadpoint 1 travels between basepoint 1 and 2, quad 2 between basepoint 2 and 3, and so on...
quadpoint#(pointnum,1) = basepoint#(pointnum,1) + (sin(basevector#(pointnum,2)) * (basevector#(pointnum,1) * segmentstep#))
quadpoint#(pointnum,2) = basepoint#(pointnum,2) + (cos(basevector#(pointnum,2)) * (basevector#(pointnum,1) * segmentstep#))
next pointnum
` calculate absolute bezier point
quadvector#(1,1) = distance(quadpoint#(1,1),quadpoint#(1,2),quadpoint#(2,1),quadpoint#(2,2))
quadvector#(1,2) = angle2d(quadpoint#(1,1),quadpoint#(1,2),quadpoint#(2,1),quadpoint#(2,2))
bezierpoint#(1,1) = quadpoint#(1,1) + (sin(quadvector#(1,2)) * (quadvector#(1,1) * segmentstep#))
bezierpoint#(1,2) = quadpoint#(1,2) + (cos(quadvector#(1,2)) * (quadvector#(1,1) * segmentstep#))
ink black,black
cls
` statistics
ink white,white
print "t = ",segmentstep#
` graphics
drawbeziercurve()
inc curveposition
drawbeziercurveline(curveposition)
inc segmentstep#,segmentstepincrease#
sync
until segmentstep# > 1.00
` __________________________________________________________
` endprogram loop
print "Press any key to end"
repeat
sync
until scancode() > 0
cls
end
` ________________________________________________________
` (((((((((((((((((((( FUNCTIONS )))))))))))))))))))))))
function distance(x1#,y1#,x2#,y2#)
distance# = sqrt((x2# - x1#)^2 + (y2# - y1#)^2)
endfunction distance#
function angle2d(x1#,y1#,x2#,y2#)
angle# = atanfull(x2# - x1#,y2# - y1#)
endfunction angle#
function drawbeziercurve()
` constants
red = rgb(255,0,0) : grey = rgb(200,200,200) : green = rgb(0,255,0)
pointsize = 8
` base lines and points
ink grey,grey
for pointnum = 1 to 3
circle basepoint#(pointnum,1),basepoint#(pointnum,2),pointsize
next pointnum
line basepoint#(1,1),basepoint#(1,2),basepoint#(2,1),basepoint#(2,2)
line basepoint#(2,1),basepoint#(2,2),basepoint#(3,1),basepoint#(3,2)
` quadratic line and points
ink green,green
circle quadpoint#(1,1),quadpoint#(1,2),pointsize
circle quadpoint#(2,1),quadpoint#(2,2),pointsize
line quadpoint#(1,1),quadpoint#(1,2),quadpoint#(2,1),quadpoint#(2,2)
` absolute bezier point
ink red,red
circle bezierpoint#(1,1),bezierpoint#(1,2),pointsize
endfunction
function drawbeziercurveline(pos)
curve#(pos,1) = bezierpoint#(1,1) : curve#(pos,2) = bezierpoint#(1,2)
` draw a line between each curve point
for curvepoint = 1 to pos
if curvepoint > 1
lastpoint = curvepoint - 1
line curve#(lastpoint,1),curve#(lastpoint,2),curve#(curvepoint,1),curve#(curvepoint,2)
endif
next curvepoint
endfunction
Next, I will try to implement higher-order bezier curves. This, and a goal towards an understaning of creating a connectable bezier curve path.
So far this seems to have started out on the correct foot, unlike most projects I begin.