Qbasicnews.com

Full Version: Triangle routine gone haywire
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Pages: 1 2 3 4 5
Well, not haywire, but at some points it will just draw two dots instead of the entire triangle. I was hoping you guys would be able to figure it out.
Code:
DEFINT A-Z
'$DYNAMIC
DECLARE SUB Triangle2 (x1%, y1%, x2%, y2%, x3%, y3%, c%)

DIM SHARED buffer(32001), lutsegy(199) AS LONG

CONST PI180 = 3.141592654# / 180

buffer(0) = 2560: buffer(1) = 200
FOR n& = 0 TO 199
  lutsegy(n&) = n& * 320 + 4
NEXT

SCREEN 13
DEF SEG = VARSEG(buffer(0))

x1 = 11: y1 = 1
x2 = 1: y2 = 21
x3 = 21: y3 = 21
xc = 149
yc = 89
       t# = TIMER
DO
Triangle2 x1, y1, x2, y2, x3, y3, 4
ang = ang + 3: IF ang > 359 THEN ang = ang - 360
  x1 = (COS(ang * PI180) * 30) + 189
  y1 = (SIN(ang * PI180) * 30) + 149
  x2 = (COS((ang + 120) * PI180) * 30) + 189
  y2 = (SIN((ang + 120) * PI180) * 30) + 149
  x3 = (COS((ang + 240) * PI180) * 30) + 189
  y3 = (SIN((ang + 240) * PI180) * 30) + 149
PUT (0, 0), buffer, PSET
REDIM buffer(32001)
buffer(0) = 2560: buffer(1) = 200
fr = fr + 1
FOR g = 0 TO 500: WAIT &H3DA, 8: NEXT
LOOP UNTIL LEN(INKEY$)

           PRINT fr / (TIMER - t#)

SUB Triangle2 (x1%, y1%, x2%, y2%, x3%, y3%, c%)
DIM addr AS LONG
    'This one uses some tricks with integer math to avoid
    'any floating point math

    IF y1% > y2% THEN SWAP y1%, y2%: SWAP x1%, x2%
    IF y1% > y3% THEN SWAP y1%, y3%: SWAP x1%, x3%
    IF y2% > y3% THEN SWAP y2%, y3%: SWAP x2%, x3%

    DeltaY1% = y2% - y1%
    DeltaY2% = y3% - y2%
    DeltaY3% = y3% - y1%

    IF DeltaY1% THEN d1& = (x2% - x1%) * &H10000 \ DeltaY1%
    IF DeltaY2% THEN d2& = (x3% - x2%) * &H10000 \ DeltaY2%
    IF DeltaY3% THEN d3& = (x3% - x1%) * &H10000 \ DeltaY3%

    lx& = x1% * &H10000
    rx& = lx&

    addr = lutsegy(y1%)
    FOR y% = y1% TO y2% - 1 'Draw from high point to mid point
    lx% = lx& \ &H10000
    rx% = rx& \ &H10000
    FOR l = lx% TO rx%
        POKE addr + l, c%
    NEXT
    lx& = lx& + d1&
    rx& = rx& + d3&
    addr = addr + 320
    NEXT

    lx& = x2% * &H10000
    addr = lutsegy(y2%)
    FOR y% = y2% TO y3%     'Draw from mid point to low point
    lx% = lx& \ &H10000
    rx% = rx& \ &H10000
    FOR l = lx% TO rx%
        POKE addr + l, c%
    NEXT
    lx& = lx& + d2&
    rx& = rx& + d3&
    addr = addr + 320
    NEXT

END SUB
Can no one figure this out??
Too complicated for my simple, unintellegent mind.
Dang it! It works when I use the LINE command, but not with my buffering stuff! THIS IS SO CONFUSING!!
maybe your buffering stuff is somehow different than your line command. try to compare them....
What do you mean "compare them"?
I really haven't looked at the code in detail but FOR NEXT loops Increment (unles you -Step) so you might try to look at it. :*)
I don't really understand what you mean, rel. :\
Rel probably means you should put
Code:
IF rx%>lx% THEN SWAP rx%,rx%
before your inner loops, because this is what the FOR expects
Thanks, that worked perfectly, but is there any way at all to reduce the amount of IF statements? It's really hurting the speed...
Pages: 1 2 3 4 5