Discussion:
[Algorithms] Draw & fill regular polygon?
Joel B
2011-08-10 11:49:21 UTC
Permalink
I should know how to do this, but i don't. I only have the ability in my system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap as a byte array. Can someone tell me the stepwise procedure to draw a polygon of n sides and then fill it? Having trouble finding anything online that doesn't use pre-existing primitives or libraries.

Thanks,

Joel
Sent from my iPhone
Manuel Massing
2011-08-10 12:26:11 UTC
Permalink
Hi Joel,
Post by Joel B
I should know how to do this, but i don't. I only have the ability in my
system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap as
a byte array. Can someone tell me the stepwise procedure to draw a polygon
of n sides and then fill it? Having trouble finding anything online that
doesn't use pre-existing primitives or libraries.
I think the easiest way to fill a convex polygon is to generate horizontal
spans, and fill them in.
Declare two arrays (e.g. "left" and "right"), which will be used to store the
horizontal spans of the polygon. Initialize them with max/min of your
datatype.
Rasterize each segment on the polygon boundary, by stepping along the y-axis.
and store the corresponding x coordinate. Something like:

// Caveat: hande horizontal segments, last segment, etc.
float dX = (float)(boundary[i+1].x - boundary[i].x)/(boundary[i+1].y -
boundary[i].y);
float X = boundary[i].x + 0.5;
for (int y = boundary[i].y; y < max_y; y++)
{
X+= dX;
left[y] = min(left[y], (int)X);
right[y] = max(right[y], (int)X);
}

Now, fill in the spans:

for (y = min_y; y < max_y; y++)
for (x = left[y]; x <= right[y]; x++)
put_pixel(x, y, color); // Do this via memset instead!

hope this helps.

Manuel
Simon Fenney
2011-08-10 12:49:11 UTC
Permalink
Does it have to be online? Foley, van Dam, Feiner and Hughes have
plenty of details on scan line rendering.

-----Original Message-----
From: Joel B [mailto:***@earthlink.net]
Sent: 10 August 2011 12:49
To: Game Development Algorithms
Subject: [Algorithms] Draw & fill regular polygon?

I should know how to do this, but i don't. I only have the ability in my
system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap
as a byte array. Can someone tell me the stepwise procedure to draw a
polygon of n sides and then fill it? Having trouble finding anything
online that doesn't use pre-existing primitives or libraries.

Thanks,

Joel
Sent from my iPhone
------------------------------------------------------------------------
------
uberSVN's rich system and user administration capabilities and model
configuration take the hassle out of deploying and managing Subversion
and the tools developers use with it. Learn more about uberSVN and get a
free download at: http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
GDAlgorithms-list mailing list
GDAlgorithms-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
Archives:
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-lis
t
Richard Fabian
2011-08-10 13:21:33 UTC
Permalink
Post by Joel B
I should know how to do this, but i don't. I only have the ability in my system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap as a byte array. Can someone tell me the stepwise procedure to draw a polygon of n sides and then fill it? Having trouble finding anything online that doesn't use pre-existing primitives or libraries.
Thanks,
Joel
if you already have a line drawing function, then use the code from
that to update a pair of arrays of min/max on the x axis:

int xmin[SCREEN_HEIGHT] = { SCREEN_WIDTH... }
int xmax[SCREEN_HEIGHT] = { -1... }

then for each step of your line drawing function update the min/max:

replace your: put_pixel(x,y,colour)
with: xmin[y] = min(x,xmin[y]); xmax[y] = max(x,xmax[y]);

Once you have the arrays, it's a simple case of iterating over them
and rendering all pixels between the min and max where the difference
is positive.

foreach y in SCREEN_HEIGHT:
if( xmax[y] > xmin[y] )
foreach( x in range( xmin[y], xmax[y] ):
put_pixel( x,y, colour )

and you have an untextured triangle.
if you want it textured, don't forget to store only UV values when the
max/min is updated.
--
fabs();
Just because the world is full of people that think just like you,
doesn't mean the other ones can't be right.
Jacobo Ríos
2011-08-10 15:15:21 UTC
Permalink
Hi Joel,

Maybe what you're looking for is something like this:

http://www.dpfiles.com/dpfileswiki/index.php?title=Tricks_of_the_Windows_Game_Programming_Gurus%2C_Chapter_8:_Vector_Rasterization_and_2D_Transformations#Solid_Filled_Polygons

it's from an old book of Andre LaMothe, in this chapter he described how to
rasterize poligons with just a pointer to vram.

check it out.

hope it's usefull. ;)


*"It's not that I'm insane, it just happens that I'm very creative with my
own sanity"*
Post by Joel B
Post by Joel B
I should know how to do this, but i don't. I only have the ability in my
system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap as a
byte array. Can someone tell me the stepwise procedure to draw a polygon of
n sides and then fill it? Having trouble finding anything online that
doesn't use pre-existing primitives or libraries.
Post by Joel B
Thanks,
Joel
if you already have a line drawing function, then use the code from
int xmin[SCREEN_HEIGHT] = { SCREEN_WIDTH... }
int xmax[SCREEN_HEIGHT] = { -1... }
replace your: put_pixel(x,y,colour)
with: xmin[y] = min(x,xmin[y]); xmax[y] = max(x,xmax[y]);
Once you have the arrays, it's a simple case of iterating over them
and rendering all pixels between the min and max where the difference
is positive.
if( xmax[y] > xmin[y] )
put_pixel( x,y, colour )
and you have an untextured triangle.
if you want it textured, don't forget to store only UV values when the
max/min is updated.
--
fabs();
Just because the world is full of people that think just like you,
doesn't mean the other ones can't be right.
------------------------------------------------------------------------------
uberSVN's rich system and user administration capabilities and model
configuration take the hassle out of deploying and managing Subversion and
the tools developers use with it. Learn more about uberSVN and get a free
download at: http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
GDAlgorithms-list mailing list
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list
Joel B
2011-08-11 16:32:08 UTC
Permalink
Post by Manuel Massing
Hi Joel,
http://www.dpfiles.com/dpfileswiki/index.php?title=Tricks_of_the_Windows_Game_Programming_Gurus%2C_Chapter_8:_Vector_Rasterization_and_2D_Transformations#Solid_Filled_Polygons
it's from an old book of Andre LaMothe, in this chapter he described how to rasterize poligons with just a pointer to vram.
check it out.
hope it's usefull. ;)
Very nice!

Graham Rhodes ARA/SED
2011-08-10 15:29:27 UTC
Permalink
Some helpful Google search terms are "polygon rasterization" and "polygon scan conversion." Someone else mentioned the Foley/van Dam book/et al. book, which is a good reference that describes the classic algorithm. The book Graphics Gems I also has a discussion, though it is brief. You can also find this stuff online, for free. For example, two sets of lecture slides from University of Virginia that look good:

http://www.cs.virginia.edu/~gfx/courses/2004/Intro.Fall.04/handouts/11-polyscan.pdf
www.cs.virginia.edu/~asb/teaching/cs445-fall06/slides/09-rasterization.ppt

I even found this YouTube video:



Graham

-----Original Message-----
From: Joel B [mailto:***@earthlink.net]
Sent: Wednesday, August 10, 2011 7:49 AM
To: Game Development Algorithms
Subject: [Algorithms] Draw & fill regular polygon?

I should know how to do this, but i don't. I only have the ability in my system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap as a byte array. Can someone tell me the stepwise procedure to draw a polygon of n sides and then fill it? Having trouble finding anything online that doesn't use pre-existing primitives or libraries.

Thanks,

Joel
Sent from my iPhone
------------------------------------------------------------------------------
uberSVN's rich system and user administration capabilities and model
configuration take the hassle out of deploying and managing Subversion and
the tools developers use with it. Learn more about uberSVN and get a free
download at: http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
GDAlgorithms-list mailing list
GDAlgorithms-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
Archives:
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list
Martin Gladnishki
2011-08-11 06:05:27 UTC
Permalink
There are also a number of line rasterizing algorithms that do 2, even 3
pixels per iteration, i.e. with them you will be able to fill the arrays
faster. Lookup for double-step rasterizing algorithms.

Also, in my experience the extrema arrays are not needed: for convex
polygons there are only two active edges at a time, therefore you just need
to traverse the poly in clockwise and anti-clockwise order to switch the
active edges until they meet at the maximum Y coordinate.

Hope that helps further.

Cheers,
Martin
Post by Graham Rhodes ARA/SED
Some helpful Google search terms are "polygon rasterization" and "polygon
scan conversion." Someone else mentioned the Foley/van Dam book/et al. book,
which is a good reference that describes the classic algorithm. The book
Graphics Gems I also has a discussion, though it is brief. You can also find
this stuff online, for free. For example, two sets of lecture slides from
http://www.cs.virginia.edu/~gfx/courses/2004/Intro.Fall.04/handouts/11-polyscan.pdf
www.cs.virginia.edu/~asb/teaching/cs445-fall06/slides/09-rasterization.ppt<http://www.cs.virginia.edu/%7Easb/teaching/cs445-fall06/slides/09-rasterization.ppt>
http://youtu.be/TNbkX5bYrtE
Graham
-----Original Message-----
Sent: Wednesday, August 10, 2011 7:49 AM
To: Game Development Algorithms
Subject: [Algorithms] Draw & fill regular polygon?
I should know how to do this, but i don't. I only have the ability in my
system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap as a
byte array. Can someone tell me the stepwise procedure to draw a polygon of
n sides and then fill it? Having trouble finding anything online that
doesn't use pre-existing primitives or libraries.
Thanks,
Joel
Sent from my iPhone
------------------------------------------------------------------------------
uberSVN's rich system and user administration capabilities and model
configuration take the hassle out of deploying and managing Subversion and
the tools developers use with it. Learn more about uberSVN and get a free
download at: http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
GDAlgorithms-list mailing list
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list
------------------------------------------------------------------------------
uberSVN's rich system and user administration capabilities and model
configuration take the hassle out of deploying and managing Subversion and
the tools developers use with it. Learn more about uberSVN and get a free
download at: http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
GDAlgorithms-list mailing list
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list
Derek Burnheim
2011-08-11 07:01:16 UTC
Permalink
Michael Abrash's Mode-X articles in DDJ and Chris Hecker's Game Developer
articles on perspective correct texture mapping should be required reading
for anybody interested in this kind of thing.



My Google-fu failed to turn up Abrash's articles but it sounds like they
were reprinted in his Graphics Programming Black Book special edition.



Chris Hecker's series of articles on perspective texture mapping can be
found on his website:
http://chrishecker.com/Miscellaneous_Technical_Articles#Perspective_Texture_
Mapping



Cheers

Derek





From: Martin Gladnishki [mailto:***@gmail.com]
Sent: Thursday, 11 August 2011 4:05 PM
To: Game Development Algorithms
Subject: Re: [Algorithms] Draw & fill regular polygon?



There are also a number of line rasterizing algorithms that do 2, even 3
pixels per iteration, i.e. with them you will be able to fill the arrays
faster. Lookup for double-step rasterizing algorithms.

Also, in my experience the extrema arrays are not needed: for convex
polygons there are only two active edges at a time, therefore you just need
to traverse the poly in clockwise and anti-clockwise order to switch the
active edges until they meet at the maximum Y coordinate.

Hope that helps further.

Cheers,
Martin

On Wed, Aug 10, 2011 at 6:29 PM, Graham Rhodes ARA/SED <***@ara.com>
wrote:

Some helpful Google search terms are "polygon rasterization" and "polygon
scan conversion." Someone else mentioned the Foley/van Dam book/et al. book,
which is a good reference that describes the classic algorithm. The book
Graphics Gems I also has a discussion, though it is brief. You can also find
this stuff online, for free. For example, two sets of lecture slides from
University of Virginia that look good:

http://www.cs.virginia.edu/~gfx/courses/2004/Intro.Fall.04/handouts/11-polys
can.pdf
<http://www.cs.virginia.edu/%7Egfx/courses/2004/Intro.Fall.04/handouts/11-po
lyscan.pdf>
www.cs.virginia.edu/~asb/teaching/cs445-fall06/slides/09-rasterization.ppt
<http://www.cs.virginia.edu/%7Easb/teaching/cs445-fall06/slides/09-rasteriza
tion.ppt>

I even found this YouTube video:

http://youtu.be/TNbkX5bYrtE

Graham


-----Original Message-----
From: Joel B [mailto:***@earthlink.net]

Sent: Wednesday, August 10, 2011 7:49 AM
To: Game Development Algorithms
Subject: [Algorithms] Draw & fill regular polygon?

I should know how to do this, but i don't. I only have the ability in my
system to draw lines (x1,y1,x2,y2)' to a bitmap, or write to the bitmap as a
byte array. Can someone tell me the stepwise procedure to draw a polygon of
n sides and then fill it? Having trouble finding anything online that
doesn't use pre-existing primitives or libraries.

Thanks,

Joel
Sent from my iPhone
----------------------------------------------------------------------------
--
uberSVN's rich system and user administration capabilities and model
configuration take the hassle out of deploying and managing Subversion and
the tools developers use with it. Learn more about uberSVN and get a free
download at: http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
GDAlgorithms-list mailing list
GDAlgorithms-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
Archives:
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list

----------------------------------------------------------------------------
--
uberSVN's rich system and user administration capabilities and model
configuration take the hassle out of deploying and managing Subversion and
the tools developers use with it. Learn more about uberSVN and get a free
download at: http://p.sf.net/sfu/wandisco-dev2dev
_______________________________________________
GDAlgorithms-list mailing list
GDAlgorithms-***@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gdalgorithms-list
Archives:
http://sourceforge.net/mailarchive/forum.php?forum_name=gdalgorithms-list
Fabian Giesen
2011-08-11 07:54:46 UTC
Permalink
Post by Martin Gladnishki
There are also a number of line rasterizing algorithms that do 2, even 3
pixels per iteration, i.e. with them you will be able to fill the arrays
faster. Lookup for double-step rasterizing algorithms.
Also, in my experience the extrema arrays are not needed: for convex
polygons there are only two active edges at a time, therefore you just
need to traverse the poly in clockwise and anti-clockwise order to
switch the active edges until they meet at the maximum Y coordinate.
Even for general polygons, the auxiliary arrays aren't necessary; you
keep a linked list of active edges sorted by their current x coordinate
(in the last processed scanline). This is fairly simple to code (and
keep up to date).
Joel B
2011-08-11 16:17:12 UTC
Permalink
Hi Graham,

www.cs.virginia.edu/~asb/teaching/cs445-fall06/slides/09-rasterization.ppt

Thanks, this is a stunningly good PPT presentation.

- Joel
Loading...