Setup Method
    protected boolean triangleSetup(Raster r) {
        if (edge == null) edge = new EdgeEqn[3];
        
        /*  Compute the three edge equations  */
        edge[0] = new EdgeEqn(v[0], v[1]);
        edge[1] = new EdgeEqn(v[1], v[2]);
        edge[2] = new EdgeEqn(v[2], v[0]);
        
        /*  Trick #1: Orient edges so that the triangle's interior lies within all of
            their positive half-spaces. Assuring that the area is positive accomplishes this
        */
        area = edge[0].C + edge[1].C + edge[2].C;
        if (area == 0) return false;                // degenerate triangle
        if (area < 0) {
            edge[0].flip();    edge[1].flip();    edge[2].flip();
            area = -area;
        }
        
        /*  Trick #2: compute bounding box  */
        int xflag = edge[0].flag + 2*edge[1].flag + 4*edge[2].flag;
        int yflag = (xflag >> 3) - 1;
        xflag = (xflag & 7) - 1;
        xMin = (int) (v[sort[xflag][0]].x);
        xMax = (int) (v[sort[xflag][1]].x + 1);
        yMin = (int) (v[sort[yflag][1]].y);
        yMax = (int) (v[sort[yflag][0]].y + 1);
        
        /*  clip triangle's bounding box to raster  */
        xMin = (xMin < 0) ? 0 : xMin;
        xMax = (xMax >= r.width) ? r.width - 1 : xMax;
        yMin = (yMin < 0) ? 0 : yMin;
        yMax = (yMax >= r.height) ? r.height - 1 : yMax;
        return true;
    }
Lecture 7 Slide 18 6.837 Fall '98