|
Submitted by , posted on 09 May 2002
|
|
Image Description, by
This is a program I wrote to test two algorithms for reducing polygons to
triangles. The algorithms will work for any convex polygon with three or more
sides. The images on the top show two algorithms used on the same polygon,
and the images on the bottom show the results of a million-sided polygon with
the first algorithm (although the low resolution hides a lot of edge detail)
and the progress of the recursive processing. I came up with these algorithms
for a model converter for the game I'm working on.
Both algorithms have the same input: a list of vertices. The vertices must be
in order, and both algorithms will produce triangles with the same winding as
the original polygon if used properly. If you want to implement one of them,
I found it very convenient to make a copy of the first vertex at the end of
the list.
The first algorithm is the "recursive edge" algorithm. It works by making
triangles around the edge (vertices 1 to 3, 3 to 5, etc), making a list of
the endpoints of those triangles and any unused vertices, and calling itself
again on that list. In this program, it changes color each time it recurses -
as you can see, it takes three levels to process a 10-sided polygon. The
million-sided polygon looks like it only takes 4 levels, but that's because
it only cycles through 4 colors - it really takes 19 levels of recursion to
process.
The second algorithm basically produces a triangle strip. This one is much
simpler: it takes the first vertex to start off the triangles, then splits
the rest of the list in two. The first list is vertices 2 to (n / 2) + 1, and the
second list is vertices n to (n / 2) + 2. After starting off with the first
vertex from each list, it alternately takes vertices from each list to make a
"triangle strip". It changes colors at each triangle, so you can see the
progress.
The full source code of the program and a readme with more detail are
available at http://www.collapsarcreations.com/dl.php, at the bottom. I wrote
it in Linux, but since it uses GTK it shouldn't be too hard to compile in
Windows.
|
|