/**
 * Trieda popisujuca dvojrozmerny vektor
 * a staticke metody pre narabanie s vektormi
 * Pre odbornikov poznamanevame, ze sa tu trochu priecime ducho objektoveho programovania
 * lebo pouzivame skor proceduralny pristup cez staticke metody triedy namiesto toho
 * aby sme volali objekt a jeho metody.
 * Staticky pristup sa nam javi sympatickejsi najme pri scitani dvoch vektorov,
 * lebo je voci obom vektorom sysmetricky
 * Pri nasobeni vektora skalarom by uzx bol mozno prirodzenesji objektovy pristup,
 * ale pre zaciatocnikov je nazornejsi staticky pristup
 * Pri "jednovektorovych" funkciach abs a unit dodrziavame prirodzeny objektovy pristup
 */
public class vector {
  /**
   * xova zlozka vektora
   */
  public double x;
  /**
   * yova zlozka vektora
   */
  public double y;

  /**
   * staticka metoda scita dva vektory
   */
  public static vector plus(vector v1,vector v2){
    return new vector(v1.x+v2.x,v1.y+v2.y);
  }

  /**
   * staticka metoda vynasobi vektor skalarom
   */
  public static vector times(double c, vector v){
    return new vector(c*v.x,c*v.y);
  }

  /**
   * vypocita skalarny sucin dvoch vektorov
   */
  public static double scalarproduct(vector v1, vector v2){
    return (v1.x*v2.x+v1.y*v2.y);
  }

  public vector(double vx, double vy){
   this.x=vx;
   this.y=vy;
  }

  /**
   * Vrati velkost vektora
   */
  public double abs(){
    return Math.sqrt(this.x*this.x+this.y*this.y);//this nemusime pisat, ale zvysuje to citatelnost
  }

  /**
   * Vrati jednotkovy vektor v smere vektora this
   */
  public vector unit(){
    double length = abs();
    if (length == 0) throw new Error("Pokus robit jednotkovy vektor z vektora nulovej dlzky");
    return new vector(this.x/length, this.y/length); //this nemusime pisat, ale zvysuje to citatelnost
  }

  /**
   * Vrati jednotkovy vektor smerujuci z bodu A do bodu B
   */
  public static vector direction(point B, point A){
    vector v = new vector(B.x-A.x,B.y-A.y);
    return v.unit();
  }
}
