CS-460, Assignment # 4
Due Date: 3-15-02

Part A of this assignment is to be implemented in an openGL  program using 
Microsoft Visual C++ (MFC). Part B should be a second MFC program that uses 
the Windows GDI (not openGL).

Part A.

In this part of the assignment, using OpenGL in an MFC application, you 
are to implement the scanline polygon fill algorithm discussed in class 
to fill a convex polygon with a two-color pattern defined by the user. You 
are to write the routine as a Visual C++ function that takes the following 
parameters: the number of vertices in the polygon, the floating point RGB 
values of the two colors to be displayed in the pattern [values between 0 
and 1, to be used in calls to glColor3f()], a 16-element array of 16-bit 
integers (unsigned) that represents the fill pattern to be used, and an 
array of x,y coordinates of successive connected vertices of the polygon 
to be filled. To test your fill routine use the following sample polygon:

 int vertices[]=(200,-190,350,-100,380,-60,380,200,0,200,-100,-30,0,-190);

and the following fill pattern:

 unsigned pat[]={0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,0x00ff,

Here each bit of each element of the pat[] array determines whether the
corresponding pixel inside a 16 X 16 area of the screen is set to the
color that corresponds to the first RGB values (bit=0) or to that  of the 
second RGB values (bit=1). In other words, each element of the pat[] array 
defines a row in the pattern matrix, and the value of each bit in a given 
element determines which of the two colors the corresponding pixel in that 
row will have. If, for example, the two RGB values corresponded to red 
(bit=0 ==> R=1.0, G=0.0, B=0.0) and blue (bit=1 ==> R=0.0, G=0.0, B=1.0), 
in the pattern given above, then the first row would have its pixels set 
as rrrrrrrrbbbbbbbb (r means red, b means blue). Thus, when tiled over a 
polygon, the pattern given above will form a checkerboard.

The program should call your fill function to perform the pattern area
fill. For example, if we wanted the polygon defined above to be filled
with a red/blue checkerboard pattern (i.e., using the pattern defined
above), the call to the fill function might be something like the 

   fill(13, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, pat, vertices);
   // 13 vertices, Red (1.0,0.0,0.0), Blue (0.0,0.0,1.0)

Your program should define at least one other different polygon and fill
pattern and call the fill function to fill that polygon with the new
pattern. The details of how the displays are initiated (e.g., with menu 
items, keyboard presses, etc.) are up to you. 

Part B.

In this part of the assignment you are to implement the "scanline
boundary fill" algorithm (Dino's Demo) discussed briefly in class. The 
Windows GDI (not openGL) should be used in this part of the assignment. 
You may assume that the boundary to be filled is convex -- that is, 
there will never be a situation where there is more than one pixel 
above and one pixel below the current line that needs to be pushed 
onto the stack. You may also take the fill color and the boundary color 
to be the same. Your implementation is to be a function that takes a 
seed point (xseed,yseed) and the boundary/fill color (bf_Color):

   slb_fill (int xseed, int yseed, COLORREF bf_Color);

Test your routine on several circles that have been drawn in a given
color. For example:

   COLORREF m_color = RGB(0,255,0);  // green boundary-fill color
   pDC = GetDC();
   CPen pen(PS_SOLID, 1, m_color);
   CPen *pPenOld = pDC->SelectObject(&Pen);
   slb_fill(250,200,m_color);    // this is the call to your function
   // Do more circles as above