CS 100: Lecture L26

April 29

| Back to Lecture Index |


Demo for the triangle3D class

import java.io.*;
import java.awt.*;

public class L26CShow extends Frame
{
    public static void ShowTriangle(Graphics g,Triangle3D T)
    {
       double[][] V = T.getVertices();
       int[] h = new int[3];
       int[] v = new int[3];
       
       h[0] = 400 + (int)V[0][0];  v[0] = 300 - (int)V[0][1];
       h[1] = 400 + (int)V[1][0];  v[1] = 300 - (int)V[1][1];
       h[2] = 400 + (int)V[2][0];  v[2] = 300 - (int)V[2][1];
     
       g.setColor(T.get_c());
       g.drawLine(h[0],v[0],h[1],v[1]);
       g.drawLine(h[2],v[2],h[1],v[1]);
       g.drawLine(h[0],v[0],h[2],v[2]);
       g.fillPolygon(h,v,3);
         
    }
    
    
	public void paint(Graphics g)
	{
	   int n = 50;
	   Triangle3D[] T = new Triangle3D[n];
	   point P0,P1,P2;
	   Color c;
	   int red,green;
	   double z,r;
	   for (int i=0;i< n;i++)
	   {
	      P0 = new point(250);
	      P1 = new point(250);
	      P2 = new point(250);
	      z = Math.random();
	      red = (int)((1-z)*255);
	      r = 300*z;
	      c = new Color(red,0,0);
	      T[i] = new Triangle3D(P0,P1,P2,z,c);   
	   }	
	   Triangle3D.sort(T);
	   for(int i=n-1;i>=0;i--)
	      ShowTriangle(g,T[i]);
	      
	}
	
}

public class L26C
{
	public static void main(String args[])
	{
		L26CShow d = new L26CShow();
		d.resize(800,600);                     
		d.move(0,75);
		d.setTitle("L26C");                 
		d.show();
		d.toFront();
	}
}

The triangle3D Class:

// An instance of this class is a triangle with a 
// z-ccordinate to be
// considered its distance from the observer.
import java.awt.*;
public class Triangle3D extends Triangle
{
   protected double z;   // Distance to observer.
   protected Color c;    // Color
   
   
   // Constructor for triangle with vertices 
   // v0, v1, v2, and
   // observer distance zVal.
   public Triangle3D(point v0, point v1, point v2, double zVal, Color cVal)
   {
      super(v0,v1,v2);
      z = zVal;
      c = cVal;
   }
   
   // Constructor for equilateral triangle with radius r center cent, and
   // observer distance zVal.
   public Triangle3D(point cent, double r, double zVal, Color cVal)
   {
      super(cent,r);
      z = zVal;
      c = cVal;
   }
   
   // Yields true if this triangle is closer to the 
   // observer than T.
   public boolean closerThan(Triangle3D T)
   {
      return this.z< T.z;
   }
   
   // Yields true if this triangle is smaller in area 
   // than T.
   public boolean smallerThan(Triangle3D T)
   {
      return this.Area() < T.Area();
   }   
   
   public Color get_c()
   {
      return c;
   }
   
   public static void sort(Triangle3D[] T)
   {
       int n=T.length;
       Triangle3D temp;
	   int pass=1;
	   int swaps;      
	   boolean Sorted = false;
       while (!Sorted) 
       {
          swaps=0;
	      for (int j = 0; j < n - pass; j++) {
		     if (T[j+1].closerThan(T[j])) 
		     {
			    temp      = T[j+1];
				T[j+1] = T[j];
				T[j]   = temp;
				swaps++;
		     }
		  }
		  pass++;
		  Sorted = (pass == n) || swaps==0;
	   }
	}
}