import java.awt.Color;

/**
 * A driver that can be used to test the drawLine()
 * method in the Rasterizer2D class
 *
 * @author  Prof. David Bernstein, James Madison University
 * @version 1.0
 */
public class LineTests
{
    /**
     * The entry point of the application
     *
     * @param args   The command line arguments
     */
    public static void main(String[] args)
    {
       FrameBuffer      fb;       
       GraphicsWindow   window;
       Rasterizer2D     rasterizer;
       

       window = new GraphicsWindow();

       fb = window.getFrameBuffer();

       rasterizer = new Rasterizer2D(fb);
       rasterizer.clear(Color.WHITE);
       rasterizer.setFillTechnique(Rasterizer2D.POINTWISE);
       
       // Slope of 1
       {
          // Left to right
          double[] p = {-200, 200};
          double[] q = {-150, 250};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Right to left
          double[] p = {-150, 200};
          double[] q = {-100, 250};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Left to right
          double[] p = {- 25, 225};
          double[] q = {  25, 250};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Right to left
          double[] p = {- 25, 200};
          double[] q = {  25, 225};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Left to right
          double[] p = { 150, 200};
          double[] q = { 200, 250};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Right to Left
          double[] p = { 100, 200};
          double[] q = { 150, 250};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }



       // Slope < 1
       {
          // Left to right
          double[] p = {-250, 150};
          double[] q = {-170, 200};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Right to left
          double[] p = {-170, 150};
          double[] q = {- 90, 200};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Left to right
          double[] p = {- 40, 175};
          double[] q = {  40, 200};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Right to left
          double[] p = {- 40, 150};
          double[] q = {  40, 175};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Left to right
          double[] p = {  90, 150};
          double[] q = { 170, 200};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Right to Left
          double[] p = { 170, 150};
          double[] q = { 250, 200};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }
       

       
       // Slope > 1
       {
          // Left to right
          double[] p = {-190, 100};
          double[] q = {-150, 150};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Right to left
          double[] p = {-150, 100};
          double[] q = {-110, 150};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Left to right
          double[] p = {- 20, 125};
          double[] q = {  20, 150};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Right to left
          double[] p = {- 20, 100};
          double[] q = {  20, 125};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Left to right
          double[] p = { 160, 100};
          double[] q = { 200, 150};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Right to Left
          double[] p = { 120, 100};
          double[] q = { 160, 150};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }


       
       // Slope of -1
       {
          // Left to right
          double[] p = {-200, 100};
          double[] q = {-150,  50};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Right to left
          double[] p = {-150, 100};
          double[] q = {-100,  50};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Left to right
          double[] p = {- 25, 100};
          double[] q = {  25,  75};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Right to left
          double[] p = {- 25, 75};
          double[] q = {  25, 50};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Left to right
          double[] p = { 150, 100};
          double[] q = { 200,  50};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Right to Left
          double[] p = { 100, 100};
          double[] q = { 150,  50};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }



       
       // Slope < -1
       {
          // Left to right
          double[] p = {-200, 50};
          double[] q = {-160,  0};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Right to left
          double[] p = {-150, 50};
          double[] q = {-110,  0};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Left to right
          double[] p = {- 20, 50};
          double[] q = {  20, 25};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Right to left
          double[] p = {- 20, 25};
          double[] q = {  20,  0};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Left to right
          double[] p = { 160, 50};
          double[] q = { 200,  0};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Right to Left
          double[] p = { 110, 50};
          double[] q = { 150,  0};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }



       
       // Slope < -1
       {
          // Left to right
          double[] p = {-230, 0};
          double[] q = {-150,  -50};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Right to left
          double[] p = {-150, 0};
          double[] q = {- 70,  -50};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Left to right
          double[] p = {- 40, 0};
          double[] q = {  40, -25};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Right to left
          double[] p = {- 40, -25};
          double[] q = {  40, -50};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Left to right
          double[] p = { 150, 0};
          double[] q = { 230,  -50};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Right to Left
          double[] p = { 70, 0};
          double[] q = { 150,  -50};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }



       // Horizontal
       {
          // Left to right
          double[] p = {-200, -100};
          double[] q = {-150, -100};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Right to left
          double[] p = {-150, -100};
          double[] q = {-100, -100};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Left to right
          double[] p = {-50, -100};
          double[] q = { 50, -100};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Right to left
          double[] p = {- 50, -125};
          double[] q = {  50, -125};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Left to right
          double[] p = { 200, -100};
          double[] q = { 150, -100};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Right to left
          double[] p = { 150, -100};
          double[] q = { 100, -100};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }


       // Vertical
       {
          // Top to bottom
          double[] p = {-200, -150};
          double[] q = {-200, -200};
          rasterizer.drawLine(Color.RED, p, q);
       }
       {
          // Bottom to top
          double[] p = {-150, -150};
          double[] q = {-150, -200};
          rasterizer.drawLine(Color.RED, q, p);
       }
       {
          // Top to bottom
          double[] p = { 0, -150};
          double[] q = { 0, -175};
          rasterizer.drawLine(Color.GREEN, p, q);
       }
       {
          // Bottom to top
          double[] p = {  0, -175};
          double[] q = {  0, -200};
          rasterizer.drawLine(Color.BLUE, q, p);
       }
       {
          // Top to bottom
          double[] p = { 200, -150};
          double[] q = { 200, -200};
          rasterizer.drawLine(Color.MAGENTA, p, q);
       }
       {
          // Bottom to top
          double[] p = { 150, -150};
          double[] q = { 150, -200};
          rasterizer.drawLine(Color.MAGENTA, q, p);
       }


       fb.show();
    }
}
