07-31-2003, 06:35 PM
Seems that the good ol' Line of QB plots wrong pixels:
Ligne is based on a classical Slope = dy/dx approach
Line24 is the Bresenhams algorithm used by the TC-Lib (20% faster)
Ligne is based on a classical Slope = dy/dx approach
Line24 is the Bresenhams algorithm used by the TC-Lib (20% faster)
Code:
DECLARE SUB Line24 (cx1%, cy1%, cx2%, cy2%)
DECLARE SUB Ligne (x1%, y1%, x2%, y2%)
CLS
SCREEN 12
t0 = TIMER
RANDOMIZE 1000
FOR k& = 1 TO 1000
x1% = RND * 639: x2% = RND * 639
y1% = RND * 479: y2% = RND * 479
LINE (x1%, y1%)-(x2%, y2%), 1
NEXT k&
CLS
t1 = TIMER
RANDOMIZE 1000
FOR k& = 1 TO 1000
x1% = RND * 639: x2% = RND * 639
y1% = RND * 479: y2% = RND * 479
Ligne x1%, y1%, x2%, y2%
NEXT k&
CLS
t2 = TIMER
RANDOMIZE 1000
FOR k& = 1 TO 1000
x1% = RND * 639: x2% = RND * 639
y1% = RND * 479: y2% = RND * 479
Line24 x1%, y1%, x2%, y2%
NEXT k&
t3 = TIMER
CLS
PRINT t1 - t0, t2 - t1, t3 - t2
SUB Ligne (cx1%, cy1%, cx2%, cy2%)
x1% = cx1%: x2% = cx2%: y1% = cy1%: y2% = cy2%
IF x1% = y1% AND y2% = y2% THEN PSET (x1%, y1%), 2: EXIT SUB
IF x1% = x2% THEN
FOR y% = y1% TO y2% STEP SGN(y2% - y1%)
PSET (x1%, y%), 2
NEXT y%
END IF
IF y1% = y2% THEN
FOR x% = x1% TO x2% STEP SGN(x2% - x1%)
PSET (x%, y1%), 2
NEXT x%
END IF
dx = x2% - x1%: dy = y2% - y1%
IF ABS(dy) < ABS(dx) THEN
Slope = dy / dx
FOR x% = x1% TO x2% STEP SGN(x2% - x1%)
PSET (x%, y1% + Slope * (x% - x1%)), 2
NEXT x%
ELSE
Slope = dx / dy
FOR y% = y1% TO y2% STEP SGN(y2% - y1%)
PSET (x1% + Slope * (y% - y1%), y%), 2
NEXT y%
END IF
END SUB
SUB Line24 (cx1%, cy1%, cx2%, cy2%)
x1% = cx1%: x2% = cx2%: y1% = cy1%: y2% = cy2%
IF x1% = y1% AND y2% = y2% THEN PSET (x1%, y1%), 4: EXIT SUB
IF x1% = x2% THEN
FOR y% = y1% TO y2% STEP SGN(y2% - y1%)
PSET (x1%, y%), 4
NEXT y%
END IF
IF y1% = y2% THEN
FOR x% = x1% TO x2% STEP SGN(x2% - x1%)
PSET (x%, y1%), 4
NEXT x%
END IF
IF x1% > x2% THEN SWAP x1%, x2%: SWAP y1%, y2%
IF ABS(y2% - y1%) <= ABS(x2% - x1%) THEN ' Sloped Line
IF x2% < x1% THEN SWAP x1%, x2%: SWAP y1%, y2%
x% = x1%: y% = y1%: PSET (x%, y%), 4
IF y2% < y1% THEN FlagSym% = 1 ELSE FlagSym% = 0
y2% = FlagSym% * (2 * y1% - y2%) + (1 - FlagSym%) * y2%
dx% = x2% - x1%
dy% = y2% - y1%
Ek% = 2 * dy% - dx%
Dn% = Ek% + dx%
DP% = Ek% - dx%
DO WHILE x% < x2%
x% = x% + 1
IF Ek% >= 0 THEN
Ek% = Ek% + DP%
y% = y% + 1
ELSE
Ek% = Ek% + Dn%
END IF
PSET (x%, FlagSym% * (2 * y1% - y%) + (1 - FlagSym%) * y%), 4
LOOP
ELSE
IF y2% < y1% THEN SWAP x1%, x2%: SWAP y1%, y2%
x% = x1%: y% = y1%: PSET (x%, y%), 4
IF x2% < x1% THEN FlagSym% = 1 ELSE FlagSym% = 0
x2% = FlagSym% * (2 * x1% - x2%) + (1 - FlagSym%) * x2%
dx% = x2% - x1%
dy% = y2% - y1%
Ek% = 2 * dx% - dy%
Dn% = Ek% + dy%
DP% = Ek% - dy%
DO WHILE y% < y2%
y% = y% + 1
IF Ek% >= 0 THEN
Ek% = Ek% + DP%
x% = x% + 1
ELSE
Ek% = Ek% + Dn%
END IF
PSET (FlagSym% * (2 * x1% - x%) + (1 - FlagSym%) * x%, y%), 4
LOOP
END IF
END SUB
hink Global, Make Symp' All ! ®