Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Lines algorithms
#1
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
hink Global, Make Symp' All ! ®
[Image: Banner.gif]
Reply
#2
Why dont u put it in qb.qlb. I mean introduce this routine in QB's library 8)
Reply
#3
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
i]"I know what you're thinking. Did he fire six shots or only five? Well, to tell you the truth, in all this excitement, I've kinda lost track myself. But being as this is a .44 Magnum ... you've got to ask yourself one question: 'Do I feel lucky?' Well, do ya punk?"[/i] - Dirty Harry
Reply
#4
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
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)