Polygons
Due 8 March 2018
In this assignment you'll implement both a polygon API and the scanline fill algorithm for polygons. The algorithm is probably going to become the most used piece of code you'll write this semester and will be central to your rendering system. As such, take care to comment the code and understand what is going on.
Tasks
-
Implement a subset of the polygon API functions in the
C Graphics System
Specification.
- polygon_create
- polygon_createp
- polygon_free
- polygon_init
- polygon_set
- polygon_clear
- polygon_setSided
- polygon_copy
- polygon_print
- polygon_normalize
- polygon_draw
- polygon_drawFill
-
Implement the scanline fill algorithm for polygons. You can
write it from scratch, use the version in one of the textbooks, or
use this scanfill skeleton code as
the basis for your function. Make sure that your algorithm uses the
correct placement of the coordinate grid (lower left corner of the
pixel). The name for this routine should be
polygon_drawFill(). Your algorithm should not create a
border that is a different color than the fill color. Just draw the
filled in polygon as a single color (for now).
If you want to do a gradient fill, texture fill, or pattern fill, create separate polygon_draw functions for them.
-
Implement a second polygon fill algorithm,
polygon_drawFillB() that uses barycentric coordinates to
determine which pixels to fill given a polygon with only 3 points.
Scan over the bounding box of the triangle, filling any pixel whose
barycentric coordinates are all in the range [0, 1]. The lecture
notes give the equations.
When calculating which pixels to fill, use the center of each pixel to make the determination. That means you need to add 0.5 to the x and y value of the pixel coordinates when calculating the barycentric coordinates.
Don't worry about handling special cases (boundary going through the pixel center) for now. Note that test file B shows that drawing the polygons this way is order dependent.
- One required image is the same as the previous assignment, a picture of a car, train, plane, or spaceship, except that a majority of the surfaces should be colored/filled in.
- Use test file A to create the second required image.
- Use test file B to create the third required image.
- Create two images for your portfolio using the techniques you have developed so far and any extensions you decided to pursue.
- If you wish, try running the testbench program for your fillscan and barycentric polygon functions. Note that the program makes use of a Color_set function, so you'll need to add that to your library.
- You can also try out the Polygon stress test file to see how your various polygon memory management functions are doing. Here is the expected result. If you really want to test for memory leaks, try out test4c-loop.c and then use the command line tool top to watch your memory usage. You'll have to use cntl-c to stop the top program.
Extensions
As always, these are suggestions only. If there is something you want to do that is not on the list, do it. Extensions are not all worth the same value.
- An animated gif or series of images that demonstrates the scanline fill algorithm (e.g. a short tutorial).
- Allow the use of a fill pattern (e.g. an 8x8 bitmap) in addition to the fill color.
- Allow the user to draw filled graphics primitives with a variety of overlay options so you can easily simulate transparency and other effects.
- Anti-alias your polygons.
- Allow the user to specify a gradient across a polygon, circle, or ellipse so that they appear shaded.
- Cool artistic pictures demonstrating some interesting feature of your system.
Writeup
Make a wiki page and give it the label cs351s18project4. Put up your required and portfolio images along with brief descriptions and relevant information.
Handin
Put your code on the handin server in a project 4 directory in your Private folder.
Spring 2018