import Drawable;
import java.awt.Color;

// EdgeList is the sorted array of edges, where the first edge is the leftmost side
// of the triangle, the second one is the rightmost side, and the third one is the
// side that's below the breakpoint (can be left or right, and has
// no significance if there is no breakpoint).

public class EdgeList {


  Edge edges[];
  boolean isBreakpoint;
  boolean isLeftBreakpoint;
  public Edge left, right;
  public int yBreakpoint;


  public EdgeList() {
  } 


  public EdgeList(Edge e0, Edge e1, Edge e2, boolean two) {

    if (!two)
      isBreakpoint = true;
    edges = new Edge[3];
    left = new Edge();
    right = new Edge();

    if (two)
      createEdgeList(e0, e1);
    else
      createEdgeList(e0, e1, e2);

  }


  // there is a breakpoint
  public void createEdgeList(Edge e0, Edge e1, Edge e2) {
	
    // sort the edges by their yLower coordinates; if they are equal, sort by
    // dxPerScan
    
    if (e0.yLower < e1.yLower) {
      // implies that e0.yLower = e2.yLower
      if (e0.dxPerScan < e2.dxPerScan) {
	edges[0] = e0;
	edges[1] = e2;
	edges[2] = e1;
      }
      else {
	edges[0] = e2;
	edges[1] = e0;
	edges[2] = e1;
      }
    }
    
    else if (e0.yLower < e2.yLower) {
      // implies that e0.yLower = e1.yLower
      if (e0.dxPerScan < e1.dxPerScan) {
	edges[0] = e0;
	edges[1] = e1;
	edges[2] = e2;
      }
      else { 
	edges[0] = e1;
	edges[1] = e0;
	edges[2] = e2;
      }
    }
    
    else {
      // implies that e1.yLower = e2.yLower
      if (e1.dxPerScan < e2.dxPerScan) {
	edges[0] = e1;
	edges[1] = e2;
	edges[2] = e0;
      }
      else { 
	edges[0] = e2;
	edges[1] = e1;
	edges[2] = e0;
      }
    }

    // determine whether the breakpoint is to the left or to the right
    if (edges[0].yUpper < edges[1].yUpper)
      isLeftBreakpoint = true;
    else
      isLeftBreakpoint = false;

    yBreakpoint = (int)(edges[2].yLower+1);
    // set left and right edges
    left = edges[0];
    right = edges[1];

  }


  // no breakpoint
  public void createEdgeList(Edge e0, Edge e1) {

    if (e0.xLower == e1.xLower) {
      if (e0.dxPerScan < e1.dxPerScan) {
	edges[0] = e0;
	edges[1] = e1;
      }
      else {
	edges[0] = e1;
	edges[1] = e0;
      }
    }
    else {
      if (e0.dxPerScan < e1.dxPerScan) {
	edges[0] = e1;
	edges[1] = e0;
      }
      else {
	edges[0] = e0;
	edges[1] = e1;
      }
    }
       

    left = edges[0];
    right = edges[1];
    
  }
  

  public Edge leftEdge() {
    return left;
  }

  public Edge rightEdge() {
    return right;
  }


  // reached a breakpoint, update left and right edges
  public void updateBreakpoint() {

    if (isBreakpoint) {
      if (isLeftBreakpoint) {
	left = edges[2];
      }
      else {
	right = edges[2];
      }
      isBreakpoint = false;
    }

  }


    
}
  
