import java.awt.Color;

class Kreis implements GeoSchnittstelle {
    private Punkt pM;
    private int  radius;
    int getRadius(){ return radius;}
    Kreis() {super(); pM = new Punkt(); }
    Kreis(int x, int y, int r){
       super();
       pM = new Punkt(x, y); 
       radius = r;
       }
    Kreis(Punkt p, int r){
       super();
       pM = (p instanceof GraPunkt) ? new GraPunkt((GraPunkt) p) : new Punkt(p); 
       radius = r;
       }

    public void verschieben (int delta) { verschieben(delta, delta);}
         
    public void verschieben (int dx, int dy) { pM.verschieben(dx, dy);} 
    
    public double umfang() { return pi * radius * 2; }
    public double flaeche() { return pi * radius * radius; }
    
    public String toString(){
         return "Kreis mit Radius: " + radius 
             + " und Mittelpunkt " + pM.toString()
             + " und Fläche " + flaeche();
             };
    
    Kreis groesser (Kreis k) {
        if (k.radius > radius) return k;
        else return this;
        }

    static Kreis groesser (Kreis k1, Kreis k2) {
        if (k1.radius > k2.radius) return k1;
        else return k2;
    }
  }
  
  class graKreis extends Kreis {
    private boolean sichtbar = false;
    private int dicke = 1;
    private Color randFarbe  = Color.black;
    private Color innenFarbe = Color.white;
    graKreis() {super();}
    graKreis(int x, int y, int r) { super(x, y, r); }
    graKreis(Punkt p, int r) { super(p, r); }
    graKreis(Punkt p, int r, boolean pS, int pD, Color pFR, Color pFI) { 
    	this(p, r); 
    	sichtbar = pS;
    	dicke    = pD;
    	randFarbe    = pFR; 
    	innenFarbe   = pFI; 
    	}
    void malen () { System.out.println(" Malen von Kreis.");   }
    void loeschen () { System.out.println(" Loeschen von Kreis.");   }
    public void verschieben (int dx, int dy) {
         loeschen ();
         super.verschieben(dx, dy);
         malen ();
         }
         
    public String toString(){
    	   String s1 = sichtbar ? " sichtbar " : " nicht sichtbar ";
         String s2 = " Dicke: " + dicke;
         String s3 = " Rand-Farbe: " + randFarbe;
         String s4 = " Innen-Farbe: " + innenFarbe;
         return super.toString() + "\n...gra:" + s1 + s2 + s3 + s4;
         };
  }


  class Rechteck implements GeoSchnittstelle {
    private Punkt p1, p2;
    Rechteck() {super(); p1 = new Punkt(); p2 = new Punkt();}
    Rechteck(int x1, int y1, int x2, int y2){
       super();
       p1 = new Punkt(x1, y1); 
       p2 = new Punkt(x2, y2);
       }
    Rechteck(Punkt pp1, Punkt pp2){
       super();
       p1 = pp1; 
       p2 = pp2;
       }
       
    Punkt getP1(){ return p1;}
    Punkt getP2(){ return p2;}
    
    public void verschieben (int delta) { verschieben(delta, delta);}
    
    public void verschieben (int dx, int dy) {
         p1.verschieben(dx, dy);
         p2.verschieben(dx, dy);
         }
     
    public double umfang() { 
	      double seite1 =  Math.abs(p1.getX() - p2.getX());
	      double seite2 =  Math.abs(p1.getY() - p2.getY());
	      return 2 * (seite1 + seite2);
	      }  
    public double flaeche() { 
	    double seite1 =  Math.abs(p1.getX() - p2.getX());
	    double seite2 =  Math.abs(p1.getY() - p2.getY());
	    return seite1 * seite2; 
	 }
    
    public String toString(){
	   return "Rechteck 1. Punkt: " + p1.toString() 
		      + " 2. Punkt: " + p2.toString();
	 }
    }



class Linie implements GeoSchnittstelle {
    private Punkt p1, p2;
    Linie() {super(); p1 = new Punkt(); p2 = new Punkt();}
    Linie(int x1, int y1, int x2, int y2){
       super();
       p1 = new Punkt(x1, y1); 
       p2 = new Punkt(x2, y2);
       }
    Linie(Punkt pp1, Punkt pp2){
       super();
       p1 = pp1; 
       p2 = pp2;
       }
    
    public void verschieben (int dx, int dy) {
         p1.verschieben(dx, dy);
         p2.verschieben(dx, dy);
         }
    public void verschieben (int delta) { verschieben(delta, delta); } 
    
    public double umfang() { 
    	double seite1 =  Math.abs(p1.getX() - p2.getX());
	    double seite2 =  Math.abs(p1.getY() - p2.getY());
	    return Math.sqrt(seite1*seite1 + seite2*seite2); }
	    
    public double flaeche() { return 0; }
         
    public String toString(){
         return "Linie von " + p1.toString() + " bis " + p2.toString();
         };
  }
  
  class graLinie extends Linie {
    private boolean sichtbar = false;
    private int dicke = 1;
    private Color farbe = Color.black;
    graLinie() {super();}
    graLinie(int x1, int y1, int x2, int y2) { super(x1, y1, x2, y2); }
    graLinie(Punkt pp1, Punkt pp2) { super(pp1, pp2); }
    graLinie(Punkt pp1, Punkt pp2, boolean pS, int pD, Color pF) { 
    	this(pp1, pp2); 
    	sichtbar = pS;
    	dicke    = pD;
    	farbe    = pF; 
    	}
    void malen () { System.out.println(" Malen von Linie.");   }
    void loeschen () { System.out.println(" Loeschen von Linie.");   }
    public void verschieben (int dx, int dy) {
         loeschen ();
         super.verschieben(dx, dy);
         malen ();
         }
         
    public String toString(){
    	   String s1 = sichtbar ? " sichtbar " : " nicht sichtbar ";
         String s2 = " Dicke: " + dicke;
         String s3 = " Farbe: " + farbe;
         return super.toString() + "\n...gra:" + s1 + s2 + s3;
         };
  }
