
/*
 * Generic 3D Model for Java Rubik's Cube
 * --------------------------------------
 *
 * Copyright 1996, Song Li  
 * URL: www.cs.umbc.edu/~sli2
 *
 * Portion of Program by David W. Liu  
 * URL: reality.sgi.com/employees/davidliu_mti
 *
 * 
 * You can use the code for any nonprofittable use. But remember to mention
 * the authors' names in your revised program. You are also encouraged to
 * improve the program or give your comments and bug reports. If there are
 * further questions, please contact me and I'll be glad to help. My E-Mail
 * address is: sli2@gl.umbc.edu.
 *
 */


import java.awt.*;


class Face {
    public int    VerNum;
    public Vertex Vertices  [];
    public Color  FaceColor;
  
    float  XMin, XMax;
    float  YMin, YMax;
    float  ZMin, ZMax;
  
    protected Vertex ScreenVer [] ;
    protected int    ScreenX   [] ;
    protected int    ScreenY   [] ;
  
  
    public Face (int vernum) {
        VerNum    = vernum;
        Vertices  = new Vertex [vernum];
        ScreenX   = new int [vernum] ;
        ScreenY   = new int [vernum] ;
        ScreenVer = new Vertex [vernum];
        for (int i=0; i<vernum; i++)
            ScreenVer[i] = new Vertex () ;
    }
  
  
  
  
    void CalcParam (Matrix3D viewmat) {
        viewmat.Transform (Vertices, ScreenVer, VerNum) ;

        XMin = ScreenVer[0].x; XMax = XMin;
        YMin = ScreenVer[0].y; YMax = YMin;
        ZMin = ScreenVer[0].z; ZMax = ZMin;
  
        for (int i=1; i<VerNum; i++) {
            XMin = Math.min(XMin, ScreenVer[i].x);
            XMax = Math.max(XMax, ScreenVer[i].x);
            YMin = Math.min(YMin, ScreenVer[i].y);
            YMax = Math.max(YMax, ScreenVer[i].y);
            ZMin = Math.min(ZMin, ScreenVer[i].z);
            ZMax = Math.max(ZMax, ScreenVer[i].z);
        }
    }
  
  
 
    public final boolean CloserThan (Face face) {
        return (ZMax + ZMin < face.ZMax + face.ZMin);
    }


    public void Paint (Graphics graph, int width, int height) {
        for (int i=0; i<VerNum; i++) {
            ScreenX [i] = (int) ScreenVer[i].x + width/2 ;
            ScreenY [i] = height/2 - (int) ScreenVer[i].y ;
            }

        graph.setColor (FaceColor);
        graph.fillPolygon (ScreenX, ScreenY, VerNum);
        graph.setColor (Color.black);
        graph.drawPolygon (ScreenX, ScreenY, VerNum);
    }



    public void Print () {
        System.out.println ("Face -- ") ;
        for (int i=0; i<VerNum; i++) {
            System.out.print ("Origin  ") ;
            Vertices[i].Print () ;
            System.out.print ("Screen  ") ;
            ScreenVer[i].Print () ;
            }
    }

}

