Qbasicnews.com

Full Version: Lines algorithms
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
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)

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
Why dont u put it in qb.qlb. I mean introduce this routine in QB's library 8)
yeah, but surprisingly qb's line routine is one of its few graphics routines that's faster than most asm library's line routines, so a misplaced pixel here and there isnt much of a problem for me Smile
Quote:yeah, but surprisingly qb's line routine is one of its few graphics routines that's faster than most asm library's line routines, so a misplaced pixel here and there isnt much of a problem for me Smile

Yeah, But sometimes accuracy counts. For eg. very tiny fonts in Screen 12 may look differently due to even a single misplaced pixel Big Grin