Code archives/Graphics/FAST - Scan Line Filled Polygon Function
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
Scan line filling function that works with ANY polygon. Now included is a more graphical demo on how it might be used. (see second listing) | |||||
;Scan Line Filled Polygon ;public-domain code by Darel Rex Finley, 2007 ;http://alienryderflex.com/polygon_fill/ ; ;Ported to BlitzPlus ;by Andres Amaya Jr. ;2011.02.27 ;polyFill() Demo ;by Andres Amaya Jr. ;2011.03.18 AppTitle "polyFill Demo" Global sw%, sh%, scrn% sw = 800: sh = 600 Graphics sw,sh,32,2 SeedRnd MilliSecs() scrn = CreateImage(sw,sh) Dim polyX#(500), polyY#(500), nodeX%(500) Repeat intro() WaitMouse() flipper() WaitMouse() tree() WaitMouse() bird() WaitKey() Until KeyHit(1) FreeImage scrn End Function intro() Local st%, et%, r%, g%, b%, angle% ClsColor 0,65,85 Cls drawGrid() st = MilliSecs() LockBuffer BackBuffer() starBackground() UnlockBuffer BackBuffer() et = MilliSecs()-st Color 255,255,255 Text 5,15,"200 differently colored and rotated stars in "+et+"ms" Text 460,15,"The spinning star is drawn in real time." Text sw/2,sh-30,"Left-Click to continue",1 GrabImage scrn,0,0 st = MilliSecs()+1000 r=255: g=255: b = 128 While MouseHit(1) = 0 If st < MilliSecs() Then st = MilliSecs()+500 r = Rand(90,255) g = Rand(90,255) b = Rand(90,255) End If DrawBlock scrn, 0, 0 mouseStar(r,g,b, MouseX(), MouseY(), Float(angle)) angle = (angle + 5) Mod 360 Flip Wend End Function Function flipper() Local numVerts%, oX%, oY%, wide%, high%, x%, y%, st%, et%, et2% Local minX#, minY#, maxX#, maxY# ClsColor 32,32,160 Cls Restore Dolph Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 128,128,128 st = MilliSecs() LockBuffer BackBuffer() polyFill(numVerts, minX, minY, maxX, maxY) UnlockBuffer BackBuffer() et = MilliSecs()-st st = MilliSecs() drawPoly(0,0,0, numVerts, 2) Color 0,0,0 Oval 615, 158, 16, 9, True et2 = MilliSecs()-st Color 255,255,255 Text 10, 10, "The 143 vertice dolphin polygon, filled in "+et+"ms" Text 20, 30, "The thick outline took "+et2+"ms" Text sw/2,sh-50,"The next example takes a couple of seconds to render",1 Text sw/2,sh-30,"Left-Click to continue",1 Flip End Function Function tree() Local numVerts%, oX%, oY%, wide%, high%, x%, y%, st%, et%, et2% Local minX#, minY#, maxX#, maxY# Local r#, g#, b#, dr#, dg#, db#, h# h = Float(sh) r = 255. : g = 200. : b = 10. dr = -.99*r/h: dg = -.99*g/h: db = -.99*b/h For i = 0 To sh-1 Color r,g,b Line(0,i,sw,i) r = r + dr: g = g + dg: b = b + db Next Restore Tree Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next r = 200: g = 255: b = 90 dr = -89./90.: dg = -74./75.: db = -77./78 st = MilliSecs() For i= 64 To 5 Step -1 drawPoly(r, g, b, numVerts, i) r = r + dr: g = g + dg: b = b + db Next et = MilliSecs()-st Color 80,80,0 st = MilliSecs() LockBuffer BackBuffer() polyFill(numVerts, minX, minY, maxX, maxY) UnlockBuffer BackBuffer() et2 = MilliSecs()-st Color 255, 255, 255 Text 10,sh-220, "The 418 vertice tree trunk" Text 10,sh-205, "polygon was filled in "+et2+"ms" Text 5,sh-180, "The green outline took "+et+"ms" Text 5,sh-165, "and uses the same polygon definition." Text sw/2,sh-30,"Left-Click to continue",1 Flip End Function Function bird() Local numVerts%, oX%, oY%, wide%, high%, x%, y%, st%, et% Local minX#, minY#, maxX#, maxY# ClsColor 80, 180, 255 Cls Restore eagle1 Read numVerts, oX, oY, wide, high minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x, y polyX(i) = x + oX polyY(i) = y + oY Next Color 68, 68, 0 st = MilliSecs() LockBuffer BackBuffer() polyFill(numVerts, minX, minY, maxX, maxY) Restore eagle2 Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 83, 83, 0 polyFill(numVerts, minX, minY, maxX, maxY) Restore eagle3 Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 160,160,120 polyFill(numVerts, minX, minY, maxX, maxY) Restore eagle4 Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 240, 243, 230 polyFill(numVerts, minX, minY, maxX, maxY) Restore eagle5 Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 180, 180, 170 polyFill(numVerts, minX, minY, maxX, maxY) Restore eagle6 Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 240, 200, 65 polyFill(numVerts, minX, minY, maxX, maxY) Restore eagle7 Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 160, 160, 140 polyFill(numVerts, minX, minY, maxX, maxY) Restore eagle8 Read numVerts%, oX%, oY%, wide%, high% minX = oX : maxX = oX+wide-1 minY = oY : maxY = oY+high-1 For i% = 0 To numVerts-1 Read x%, y% polyX(i) = x + oX polyY(i) = y + oY Next Color 240, 230, 100 polyFill(numVerts, minX, minY, maxX, maxY) UnlockBuffer BackBuffer() et = MilliSecs()-st Color 0,0,0 Text sw/2,15,"This is a composite drawing of 8 separate polygons",1 Text sw/2,30,"totaling 607 vertices.",1 Text sw/2,60,"It took "+et+"ms to render this drawing.",1 Text sw/2,sh-30,"Press [ESC] to exit",1 Flip End Function Function polyFill(numSides%, minX#, minY#, maxX#, maxY#) Local pixelY%, i%, j%, nodes%, b1%, b2%, b3%, b4%, temp% Local fpixY#, f1#, f2#, f3# For pixelY = minY To maxY nodes = 0 j = numSides-1 fpixY = Float(pixelY) ;build node list For i = 0 To numSides-1 b1 = polyY(i) < fpixY b2 = polyY(j) >= fpixY b3 = polyY(j) < fpixY b4 = polyY(i) >= fpixY If (b1 And b2) Or (b3 And b4) Then f1 = fpixY - polyY(i) f2 = polyY(j)-polyY(i) f3 = polyX(j)-polyX(i) nodeX(nodes) = Floor(f1/f2*f3+polyX(i)) nodes = nodes + 1 End If j = i Next ;sort nodes i = 0 While i < nodes-1 If nodeX(i)>nodeX(i+1) Then temp = nodeX(i) nodeX(i) = nodeX(i+1) nodeX(i+1) = temp If i > 0 Then i = i - 1 Else i = i + 1 End If Wend ;draw scanline(s) For i = 0 To nodes-1 Step 2 If nodeX(i) <= maxX Then If nodeX(i+1) > minX Then If nodeX(i) < minX Then nodeX(i) = minX If nodeX(i+1) > maxX Then nodeX(i+1) = maxX Line nodeX(i),pixelY,nodeX(i+1),pixelY End If End If Next Next End Function Function min#(flt1#, flt2#) If flt1 < flt2 Then Return flt1 Else Return flt2 End Function Function max#(flt1#, flt2#) If flt2 > flt1 Then Return flt2 Else Return flt1 End Function Function drawGrid() Local x%, y% Color 144,144,144 For x = 20 To sw-20 Step 20 Line x,40,x, sh-40 Next For y = 40 To sh-40 Step 20 Line 20,y,sw-20,y Next End Function ;Draw an outline of the polygon to highlight edges Function drawPoly(r,g,b, numPoints%, penSize%) Local j%, i% ;allow variable line width and color If penSize < 1 Then penSize = 1 Color r,g,b ;draw it! j = numPoints-1 For i = 0 To numPoints-1 If penSize > 1 Then fatLine(polyX(j), polyY(j), polyX(i), polyY(i), penSize ) Else Line polyX(j), polyY(j), polyX(i), polyY(i) End If j=i Next End Function Function starBackground() Local i%, starPoints%, penSize%, bigRad%, lilRad% Local x%, y%, minX#, minY#, maxX#, maxY# For i = 0 To 199 starPoints = Rand(4,6) ;random number of star points penSize = Rand(2, 5) ;random number between 2 and 5 for line width bigRad = Rand(15, 20) ;random overall radius of a star between 20 and 40 lilRad = bigRad * Float((Rand(15, 40))/100.0) ;20 - 50% of big radius x = Rand(bigRad+20, sw-bigRad-20) ;keep all of star on screen along X-axis y = Rand(bigRad+40, sh-bigRad-40) ;...do the same along the Y-axis minX = Float(x-bigRad): minY = Float(y-bigRad) maxX = Float(x+bigRad): maxY = Float(y+bigRad) star(x, y, bigRad, lilRad, starPoints, Rand(0,72)) Color Rand(0,255), Rand(0,255), Rand(0,255) polyFill(starPoints*2, minX, minY, maxX, maxY) Next End Function Function mouseStar(r%, g%, b%, x%, y%, angle#) Local minX#, minY#, maxX#, maxY# Color r, g, b minX = Float(x-20): maxX = Float(x+20) minY = Float(y-20): maxY = Float(y+20) star(x, y, 20, 8, 5, angle#) polyFill(10, minX, minY, maxX, maxY) End Function Function star(centX#, centY#, outerRad%, innerRad%, points%, startAngle#) Local toggle%, element% Local inc#, i# If (points > 2 And points < 181) And (innerRad <= outerRad) Then inc = 360.0/(2.0 * points) toggle = 0 element = 0 i = startAngle While i <= (startAngle + 360.0) If toggle Then polyX(element) = Cos(i)* innerRad+ centX polyY(element) = Sin(i)* innerRad+ centY Else polyX(element) = Cos(i)* outerRad+ centX polyY(element) = Sin(i)* outerRad+ centY End If toggle = 1 - toggle element = element + 1 i = i + inc Wend End If End Function Function fatLine(x1%, y1%, x2%, y2%, penSize%) Local offset%, deltax%, deltay%, numovals%, d%, x%, y% Local dinc1%, dinc2%, xinc1%, xinc2%, yinc1%, yinc2% If penSize < 1 Then Return False If penSize = 1 Then Line(x1, y1, x2, y2): Return ; penSize% is thickness to draw line offset = penSize / 2 ;offset needed to place Oval correctly ; Calculate deltax and deltay for initialization deltax = Abs(x2 - x1) deltay = Abs(y2 - y1) ; Initialize all vars based on which is the independent variable If deltax >= deltay Then ; x is the independent variable numovals = deltax + 1 d = (2 * deltay) - deltax dinc1 = deltay Shl 1 dinc2 = (deltay - deltax) Shl 1 xinc1 = 1 xinc2 = 1 yinc1 = 0 yinc2 = 1 Else ; y is the independent variable numovals = deltay + 1 d = (2 * deltax) - deltay dinc1 = deltax Shl 1 dinc2 = (deltax - deltay) Shl 1 xinc1 = 0 xinc2 = 1 yinc1 = 1 yinc2 = 1 End If ; Make sure x and y move in the right directions If x1 > x2 Then xinc1 = - xinc1 xinc2 = - xinc2 End If If y1 > y2 Then yinc1 = - yinc1 yinc2 = - yinc2 End If ; Start drawing at x, y x = x1 - offset y = y1 - offset ; Draw the filled ovals For i = 1 To numovals Rect x, y, penSize, penSize, True If d < 0 Then d = d + dinc1 x = x + xinc1 y = y + yinc1 Else d = d + dinc2 x = x + xinc2 y = y + yinc2 End If Next End Function .Dolph ;========================================================== ;Number of points used to define this polygon Data 143 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data 70, 50 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 651, 469 ;========================================================== ;The 143 coordinate pairs are: Data 650,161,641,162,629,160,621,157,609,152,594,143,580,134,567,127,535,124,535,126 Data 566,128,580,135,593,143,608,153,620,158,628,161,641,163,650,162,650,166 Data 646,171,640,173,633,170,619,167,606,164,586,161,566,159,510,160,493,160 Data 481,157,476,165,465,177,450,188,432,198,421,203,406,205,386,207,373,208 Data 366,209,360,203,364,200,373,196,382,192,392,183,406,168,414,157,419,153 Data 429,151,419,152,413,156,401,169,285,195,258,202,236,212,200,229,187,235 Data 176,246,164,257,146,282,136,297,126,315,116,330,104,346,98,359,103,364 Data 105,370,105,376,104,386,104,398,101,403,99,408,96,415,93,413,87,409 Data 81,409,78,413,75,418,72,423,67,419,66,410,63,387,64,410,65,423 Data 61,423,58,423,52,423,48,423,41,426,36,433,19,455,15,462,9,468 Data 3,465,4,459,10,443,15,426,26,401,53,367,55,361,56,319,60,289 Data 65,271,83,229,102,191,130,146,160,111,186,78,190,66,192,51,188,39 Data 180,31,173,25,164,19,159,16,158,7,163,2,173,1,192,1,214,4 Data 231,9,245,13,262,21,275,27,287,32,297,33,310,31,338,28,371,28 Data 396,28,435,29,466,32,501,42,526,50,552,62,573,75,588,88,599,100 Data 609,118,614,126,619,132,624,136,632,143,641,148,647,153 .Tree ;========================================================== ;Number of points used to define this polygon Data 418 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data 170, 30 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 442, 498 ;========================================================== ;The 418 coordinate pairs are: Data 125,494,133,493,144,487,158,484,166,484,161,490,158,494,163,497,180,490,198,482 Data 208,481,206,492,218,488,246,484,264,485,301,487,320,490,339,490,315,474 Data 297,468,268,416,265,404,270,399,279,397,279,382,268,359,265,333,277,323 Data 283,313,291,307,302,302,316,299,326,305,324,317,315,326,301,340,304,352 Data 310,359,324,359,335,355,342,350,340,341,332,349,327,348,322,342,324,329 Data 332,319,337,292,345,290,362,293,381,299,385,306,382,311,359,317,386,315 Data 394,292,388,287,372,284,379,276,389,272,403,272,416,275,428,280,434,289 Data 429,293,419,296,424,301,432,301,441,296,441,285,435,274,424,267,411,263 Data 400,260,405,256,414,255,423,250,430,243,428,237,421,228,409,224,403,226 Data 403,233,405,239,410,233,418,234,418,243,415,248,405,248,400,248,392,249 Data 387,255,386,261,379,263,360,264,346,266,329,278,311,284,279,300,265,307 Data 252,303,255,294,253,283,245,276,244,265,249,256,254,254,263,259,264,267 Data 262,269,257,267,259,276,270,277,277,266,269,251,258,245,243,245,239,257 Data 238,271,240,282,231,275,225,265,233,252,245,233,248,215,257,191,265,173 Data 276,159,288,157,300,161,314,168,322,176,329,194,329,207,325,215,312,218 Data 300,221,322,222,326,227,319,233,342,223,342,205,336,187,336,177,342,178 Data 353,183,359,193,360,202,361,211,372,201,373,186,361,177,351,167,334,162 Data 315,153,308,148,312,131,320,118,331,113,345,113,356,125,355,137,347,141 Data 333,139,344,146,356,145,368,141,371,129,366,117,340,92,326,91,318,99 Data 312,103,307,104,292,99,286,95,280,85,282,77,291,75,299,77,299,81 Data 294,84,307,79,307,71,302,67,292,67,281,67,276,70,271,78,272,89 Data 276,100,285,104,293,110,291,120,286,123,276,126,270,136,268,149,260,154 Data 246,152,241,148,234,142,233,135,237,123,245,119,253,121,253,126,250,131 Data 244,135,248,141,257,139,262,128,269,116,262,104,250,102,239,109,230,118 Data 223,128,223,137,226,148,229,158,239,168,239,181,239,204,231,212,223,222 Data 217,233,214,244,209,250,201,247,194,234,194,203,200,189,207,170,208,152 Data 204,132,197,114,192,93,190,78,196,65,204,55,207,39,214,32,220,33 Data 233,42,243,48,248,58,247,67,245,75,237,76,231,72,229,62,226,52 Data 222,59,224,72,229,82,238,88,249,84,255,74,261,64,255,45,244,31 Data 228,19,207,15,198,27,186,28,170,24,162,18,151,7,143,7,128,6 Data 121,8,121,13,117,19,113,23,109,22,100,17,89,17,95,23,114,28 Data 124,32,131,24,139,20,148,27,163,39,173,39,183,46,183,55,181,63 Data 176,70,173,77,182,100,186,113,189,131,192,155,188,159,177,156,162,141 Data 160,120,159,97,149,86,138,80,116,77,104,68,87,48,71,46,66,49 Data 56,46,52,40,57,33,63,22,46,34,45,46,53,55,61,57,72,57 Data 79,63,91,69,94,76,95,84,91,89,86,92,80,97,79,105,80,117 Data 84,125,85,133,83,143,86,146,95,151,103,151,96,142,95,134,101,133 Data 95,124,91,116,92,101,102,97,120,95,133,97,143,102,147,111,148,123 Data 152,150,172,170,174,191,172,259,167,265,161,257,149,247,138,241,125,235 Data 117,221,110,218,104,209,99,194,88,195,80,189,71,181,56,179,41,179 Data 25,186,15,195,9,205,7,221,8,239,14,244,29,247,38,241,42,227 Data 28,235,22,234,15,224,17,214,19,203,30,195,41,193,55,194,66,197 Data 80,210,89,222,87,231,76,240,64,251,62,259,58,275,63,282,70,292 Data 81,299,95,304,107,302,112,294,110,284,100,293,90,295,83,289,75,282 Data 75,271,78,260,86,253,98,249,109,249,123,250,148,278,165,292,186,304 Data 202,317,215,333,219,351,219,381,217,400,211,417,203,430,185,449,174,455 Data 158,463,139,466,127,475 .eagle1 ;========================================================== ;Number of points used to define this polygon Data 350 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -5, 3 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 792, 530 ;========================================================== ;The 350 coordinate pairs are: Data 81,228,73,226,59,214,45,202,33,184,25,167,17,142,11,123,9,108,6,102 Data 11,96,17,100,19,93,14,76,13,67,13,62,18,55,27,63,33,75 Data 37,83,39,88,44,89,51,104,54,99,53,95,57,90,60,87,73,101 Data 80,114,88,128,90,135,93,131,98,129,105,131,113,141,121,155,124,160 Data 130,157,138,157,148,162,154,169,160,173,162,180,166,181,171,181,180,187 Data 191,196,194,198,195,207,201,206,210,211,218,218,222,222,223,226,229,227 Data 237,232,244,236,247,241,258,250,271,256,281,266,293,276,294,279,305,288 Data 318,297,323,303,332,312,340,319,343,326,349,333,355,338,362,344,370,341 Data 382,332,399,318,420,301,448,280,472,262,481,249,488,240,499,229,514,213 Data 528,201,542,188,552,181,560,171,575,150,583,130,592,104,600,67,600,54 Data 604,39,607,29,609,32,614,39,614,52,614,73,614,88,609,107,606,118 Data 602,126,598,131,596,135,597,140,599,134,603,135,606,134,613,128,624,122 Data 634,110,660,78,689,42,693,39,700,37,708,32,707,39,701,44,693,54 Data 687,61,682,67,679,74,668,87,657,102,646,110,651,114,671,97,688,77 Data 706,54,722,29,732,13,736,4,740,9,741,18,737,29,733,40,727,52 Data 718,64,711,74,706,80,699,87,688,100,685,103,680,110,682,115,687,113 Data 698,105,762,53,768,50,773,47,774,50,773,52,769,54,769,59,766,65 Data 759,72,748,85,739,94,731,102,722,109,717,114,715,116,715,119,716,120 Data 727,116,739,110,752,105,761,100,772,96,781,90,791,86,790,92,782,101 Data 771,107,765,111,758,115,755,119,755,124,757,125,761,122,765,120,771,117 Data 778,117,780,120,778,126,775,132,770,137,768,141,768,146,773,149,772,155 Data 767,159,762,164,756,169,755,173,759,174,761,177,760,184,756,186,753,189 Data 751,191,753,194,755,199,757,205,753,209,746,213,740,212,736,214,732,218 Data 725,222,724,225,728,228,733,231,740,235,742,241,741,247,736,251,734,254 Data 735,257,729,260,724,262,730,271,728,275,725,280,722,283,715,284,707,285 Data 713,293,713,299,709,305,703,308,697,310,692,308,693,315,692,321,688,326 Data 682,327,678,328,675,331,672,336,668,338,664,339,658,341,651,340,646,341 Data 645,345,644,350,640,355,635,357,632,359,625,359,626,364,626,370,625,377 Data 621,381,618,386,615,389,609,388,606,390,605,395,601,401,593,403,588,402 Data 586,404,586,409,583,412,580,418,577,422,573,422,569,421,566,424,564,429 Data 559,430,552,430,546,429,544,431,541,437,535,439,528,438,523,443,519,447 Data 520,449,516,453,511,454,511,456,510,462,505,464,499,464,498,464,503,470 Data 511,477,523,482,540,492,571,502,624,517,634,523,619,517,573,505,534,491 Data 513,481,501,478,510,490,507,495,501,495,494,496,494,503,496,508,492,510 Data 486,510,477,510,472,512,476,520,469,521,473,529,467,528,462,523,457,519 Data 444,517,435,514,400,505,374,498,347,489,326,482,315,477,302,470,287,462 Data 273,458,256,448,248,441,242,434,291,400,300,402,310,418,317,423,332,404 Data 341,376,328,359,305,345,279,323,254,299,220,275,205,260,190,253,179,248 Data 174,236,160,225,148,214,135,203,135,189,129,176,117,187 .eagle2 ;========================================================== ;Number of points used to define this polygon Data 86 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -2, 6 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 477, 441 ;========================================================== ;The 86 coordinate pairs are: Data 228,354,177,305,166,295,154,290,147,279,131,267,119,260,100,242,94,236,77,228 Data 54,207,46,186,38,162,50,173,57,187,59,198,67,205,71,202,64,185 Data 58,164,59,150,66,159,71,176,68,175,73,182,79,193,78,179,71,153 Data 74,145,85,153,89,170,90,183,84,180,90,189,97,191,97,181,97,166 Data 101,161,113,166,113,172,120,169,130,171,133,186,135,197,141,208,161,219 Data 175,231,181,240,188,244,213,258,231,271,240,281,254,290,272,301,288,314 Data 301,329,313,342,323,351,342,358,354,352,473,258,476,263,470,270,358,357 Data 345,366,349,371,353,383,345,384,337,386,343,389,344,393,339,393,335,399 Data 340,404,346,410,347,416,340,416,329,413,331,422,332,428,328,427,317,423 Data 320,434,310,430,307,440,298,440 .eagle3 ;========================================================== ;Number of points used to define this polygon Data 45 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -9, -2 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 627, 559 ;========================================================== ;The 45 coordinate pairs are: Data 503,477,512,481,525,488,539,495,557,503,578,510,597,515,615,520,622,520,621,525 Data 626,531,618,532,622,539,618,543,625,554,618,551,614,555,605,558,594,558 Data 582,557,569,552,559,546,551,543,551,547,531,534,527,537,520,541,514,541 Data 511,539,507,541,497,539,491,539,485,537,475,532,468,527,467,519,477,519 Data 476,514,486,513,498,514,496,505,494,497,506,498,511,495,506,489 .eagle4 ;========================================================== ;Number of points used to define this polygon Data 49 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -12, 0 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 309, 440 ;========================================================== ;The 49 coordinate pairs are: Data 198,363,208,359,219,359,228,359,238,362,251,362,263,362,269,361,276,362,282,363 Data 289,367,294,367,292,371,291,376,298,376,294,379,303,381,304,386,308,388 Data 305,392,301,395,296,399,295,403,302,407,300,412,306,418,301,418,295,418 Data 294,423,298,429,297,431,292,431,284,431,289,438,281,437,274,435,275,439 Data 267,435,258,434,254,435,250,439,246,388,248,384,256,384,253,377,245,369 Data 235,365,226,363,217,363 .eagle5 ;========================================================== ;Number of points used to define this polygon Data 27 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -12, 0 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 274, 442 ;========================================================== ;The 27 coordinate pairs are: Data 216,365,229,365,236,365,242,371,250,372,248,377,250,381,245,384,252,389,257,394 Data 255,399,261,409,267,416,273,428,263,427,272,434,266,435,258,433,257,437 Data 254,435,251,441,238,429,233,421,229,415,221,411,209,404,201,398 .eagle6 ;beak ;========================================================== ;Number of points used to define this polygon Data 25 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -21, -3 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 234, 396 ;========================================================== ;The 25 coordinate pairs are: Data 186,395,185,388,184,379,190,370,197,366,204,364,209,369,213,364,223,364,231,365 Data 231,367,227,369,224,369,222,376,228,381,233,386,230,388,225,390,221,390 Data 215,390,204,388,217,385,210,383,202,384,199,389 .eagle7 ;shadow around eye ;========================================================== ;Number of points used to define this polygon Data 18 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -6, -4 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 250, 392 ;========================================================== ;The 18 coordinate pairs are: Data 216,368,220,367,224,367,227,369,232,366,236,366,242,369,247,371,247,377,249,384 Data 248,387,242,389,229,391,230,387,232,382,227,383,223,381,222,376 .eagle8 ;eye ;========================================================== ;Number of points used to define this polygon Data 7 ;========================================================== ;x & y offsets to place polygon anywhere on screen Data -6, -4 ;change to appropriate on screen coords ;========================================================== ;width & height of the polygon;s bounding box Data 233, 378 ;========================================================== ;The 7 coordinate pairs are: Data 232,373,232,376,227,377,224,375,226,373,227,374,230,374 |
Comments
| ||
Here's a simple demo that may help others to find a use for this function in their own programs. |
| ||
Weird, the demo crashes for me on the intro () function's GrabImage call, saying the image doesn't exist (in debug mode), even if I check for 'scrn = 0' just before that line. Everything looks right to me. |
| ||
Thanks for looking into this. I've copied and pasted the code from the forum to BlitzPlus a couple of times and had no issues, whether in debug mode or not. The only other thing is to copy the code in the codebox by right-clicking on the code and choosing [Select All], then press Ctrl-C to copy to clipboard. I'm not trying to be snide or condescending in any way. I'm simply describing the method I'm using to get the code from the forum into BlitzPlus. As mentioned I did this a couple of times and have had no problems. Looking at the code some more.... Maybe because you are using Blitz3D instead of B+, you may want to move the "LockBuffer BackBuffer()" in the intro() function one line down. This will draw the "starBackground()" function before the buffer is locked. The only reason that I mention this is that I've notice that "Oval()" doesn't work in B+ when the buffer is locked. Notice in this demo "Oval() is always drawn before or after locking/unlocking the buffer. Perhaps Blitz3D has a similar 'feature' when drawing graphic primitives when the buffer is locked, or in this instance "GrabImage()". If neither of the above suggestions work, let me know and I'll dig deeper. |
| ||
Ok, you're most definitely using Blitz3D. I DL'd the Blitz3D demo and got the same error you're getting. The demo seems to run if you make the following changes for Blitz3D. (although very slowly - In B+ I get a rendering time of 10ms for the stars background, 5ms for the dolphin polygon, and 13ms for the dolphin outline) 1) The line: scrn = CreateImage sw, sh needs changing to: scrn = CreateImage 800, 600. It's located just above the DIM statement near the top of the listing. 2) Cut that line and Paste directly into the intro() function (just below 'Local' declarations should be fine). I also changed the 'Flip' statement to the 2 line version: VWait : Flip False I only tested on the first two screens because the demo version (Blitz3D v1.83) only allows 16K of code. Which means I had to delete all references to the other two demo screens. If you get this to work for you, could you post a version for B3D? |
| ||
The "Image does not exist" problem happens because of the Graphics command AFTER CreateImage. Simply move the CreateImage command so it follows Graphics. |
| ||
Thanks Floyd, that did the trick. Just one more change to allow the timing text to display. Change this: to this: |
| ||
Well done, sorted now. Very quick polyfiller! |
| ||
Thanks! Hopefully someone finds a use for this fast poly fill. I think it is probably a quick triangle filler as well. Maybe somebody like Devil's Child could test it in his software only renderer. |
| ||
Here is the function in BlitzMax. It returns an array of x intervals for every y line ( [y][xInterval1Start,xInterval1End, ...]) |
Code Archives Forum