/**
 * Klasse Punkt. Die Attribute sind private; in der Methode
 * abstand kann man auch auf die privaten Attribute des Parameters p
 * zugreifen, da er auch vom Typ Punkt ist.
 */

class Punkt
{  
   private int x, y;
   private String name;

   Punkt(int x, int y, String name)
   {
      this.x = x; 
      this.y = y;
      this.name = name;
   }

   Punkt()
   {  this(0, 0, "Pkt");  }

   Punkt(String name)
   {  this(0, 0, name);  }

   Punkt(int x, int y)
   {  this(x, y, "Pkt");  }


   /**
   * Liefere die x-Koordinate des Punktes zurueck.
   */
   int getX()
   {
      return x;
   } 

   /**
   * Setze die x-Koordinate des Punktes auf x.
   */
   void setX(int x)
   {
      this.x = x;
   }

   /**
   * Liefere die y-Koordinate des Punktes zurueck.
   */
   int getY()
   {
      return y;
   } 

   /**
   * Setze die y-Koordinate des Punktes auf y.
   */
   void setY(int y)
   {
      this.y = y;
   }

   /**
   * Liefere den Namen des Punktes zurueck.
   */
   String getName()
   {
      return name;
   } 

   /**
   * Setze den Namen des Punktes auf n.
   */
   void setName(String n)
   {
      name = n;
   }


   /**
   *  Bestimmt das Maximum dieses Punktes und des im
   *  Parameter angegebenen Punktes p.
   *  "Dieser" Punkt wird ueber "this" zurueckgegeben.
   *  @param p Vergleichspunkt
   *  @return groesserer Punkt
   */
   Punkt maximum(Punkt p)
   {
      if (laenge() > p.laenge())
         return this;
      else
         return p;
   }

   /**
   *  bestimmt den Abstand des Punktes von einem zweiten Punkt.
   *  Beachten Sie: auf die privaten Atribute x und y  
   *  des 2. Punktes (Parameter) kann man zugreifen.
   *  @param p  zweiter Punkt
   *  @return   Abstand als double
   */
   double abstand(Punkt p)
   {
      return Math.sqrt((x-p.x)*(x-p.x)
                       + (y-p.y)*(y-p.y));
   }   

   /**
   *  Berechnet den Abstand des Punktes vom Ursprung
   *  @return Laenge=Abstand vom Punkt (0,0)
   */
   double laenge()
   {  return Math.sqrt(x*x + y*y); }

   /**
   *  Ausgeben des Punktes
   */   
   void ausgeben()
   {  System.out.println(name + "(" + x + "," + y + ")"); }

   /**
   * Die Methode toString() unterstützt Zeichenkettenoperationen 
   * wie die direkte Ausgabe mittels System.out.println() oder die 
   *Verkettung über den +-Operator.
   */
   public String toString()
   {
      return name + "(" + x + "," + y + ")";
   }

   /**
   *  Punkt verschieben.
   *  @param dx Verschiebung in x-Richtung
   *  @param dy Verschiebung in y-Richtung
   */   
   void verschieben(int dx, int dy)
   {  x += dx; y += dy;  }
}
