import java.awt.*;
import java.awt.geom.*;
class dP extends Point2D.Double
 {
  static final double PI=Math.PI;
  static final double DR=PI/180;
  static final double RD=180/PI;
  //double x=0,y=0;
  double r=0,t=0;
  int xi=0,yi=0;
  Point p;
  Point2D p2d;
  dP dp;
  Dimension dim;
  public dP(dP dp)
   {
    x=dp.x;
    y=dp.y;
    com();
   }
  dP()
   {
    x=0;
    y=0;
    com();
   }
  dP(Dimension dim)
   {
    x=dim.getWidth();
    y=dim.getHeight();
    com();
   }
  void setdP(dP a)
   {
    x=a.x;
    y=a.y;
    com();
   }
  void setx(double x) 
   {
    this.x=x;
    com();
   }
  void sety(double y) 
   {
    this.y=y;
    com();
   }
  private void com()
   {
    xi=(int)Math.rint(x);
    yi=(int)Math.rint(y);
    p=new Point(xi,yi);
    p2d=new Point2D.Double(x,y);
    dim=new Dimension(xi,yi);
    r=Math.pow( Math.pow(x,2)+Math.pow(y,2),.5);
    t=RD*Math.atan2(y,x);
   }
  void setr(double r)
   {
    this.r=r;
    rtcom();
   }
  void sett(double t)
   {
    this.t=t;
    rtcom();
   }
  void rtcom() 
   {
    x=r* Math.cos(DR*t);
    y=r* Math.sin(DR*t);
    xi=(int)Math.rint(x);
    yi=(int)Math.rint(y);
    p=new Point(xi,yi);
    p2d=new Point2D.Double(x,y);
    dim=new Dimension(xi,yi);
   }
  public dP(double x,double y)
   {
    this.x=x;
    this.y=y;
    com();
   }
  public dP(int ix,int iy)
   {
    x=ix;
    y=iy;
    com();
   }
  public dP(Point p)
   {
    x=p.x;
    y=p.y;
    com();
   }
  boolean eq(dP dp) { return (dp.x == x && dp.y == y); }
  static boolean eq(dP a,dP b) { return (a.x == b.x && a.y == b.y); }
  static dP a(dP a,double b,double c) { return new dP(a.x+b,a.y+c); }
  static dP am(dP a,double b,double c) { return new dP(a.x+b,a.y-c); }
  static dP am(dP a,dP b) { return new dP(a.x+b.x,a.y-b.y); }
  static dP ma(dP a,double b,double c) { return new dP(a.x-b,a.y+c); }
  static dP ma(dP a,dP b) { return new dP(a.x-b.x,a.y+b.y); }
  static dP ax(dP a,double b) { return new dP(a.x+b,a.y); }
  static dP ax(dP a,dP b) { return new dP(a.x+b.x,a.y); }
  static dP ay(dP a,double b) { return new dP(a.x,a.y+b); }
  static dP ay(dP a,dP b) { return new dP(a.x,a.y+b.y); }
  static dP a(dP a,dP b) { return new dP(a.x+b.x,a.y+b.y); }
  static dP m(dP a,dP b) { return new dP(a.x-b.x,a.y-b.y); }
  static dP m(dP a,double b,double c) { return new dP(a.x-b,a.y-c); }
  static dP ave(dP a,dP b) { return new dP((a.x+b.x)/2,(a.y+b.y)/2); }
  static dP ave(dP a,dP b,dP c) { return new dP((a.x+b.x+c.x)/3,(a.y+b.y+c.y)/3); }
  static dP n(dP a) { return new dP(-a.x,-a.y); }
  static dP nx(dP a) { return new dP(-a.x,a.y); }
  static dP ny(dP a) { return new dP(a.x,-a.y); }
  static dP na(dP a,dP b) { return new dP(-a.x+b.x,-a.y+b.y); }
  static dP nax(dP a,dP b) { return new dP(-a.x+b.x,-a.y); }
  static dP nay(dP a,dP b) { return new dP(-a.x,-a.y+b.y); }
  static dP nm(dP a,dP b) { return new dP(-a.x-b.x,-a.y-b.y); }
  static dP nmx(dP a,dP b) { return new dP(-a.x-b.x,-a.y); }
  static dP nmy(dP a,dP b) { return new dP(-a.x,-a.y-b.y); }
  static dP nam(dP a,dP b) { return new dP(-a.x+b.x,-a.y-b.y); }
  static dP nma(dP a,dP b) { return new dP(-a.x-b.x,-a.y+b.y); }
  static dP nxa(dP a,dP b) { return new dP(-a.x+b.x,a.y+b.y); }
  static dP nxax(dP a,dP b) { return new dP(-a.x+b.x,a.y); }
  static dP nxay(dP a,dP b) { return new dP(-a.x,a.y+b.y); }
  static dP nxm(dP a,dP b) { return new dP(-a.x-b.x,a.y-b.y); }
  static dP nxmx(dP a,dP b) { return new dP(-a.x-b.x,a.y); }
  static dP nxmy(dP a,dP b) { return new dP(-a.x,a.y-b.y); }
  static dP nxam(dP a,dP b) { return new dP(-a.x+b.x,a.y-b.y); }
  static dP nxma(dP a,dP b) { return new dP(-a.x-b.x,a.y+b.y); }
  static dP nya(dP a,dP b) { return new dP(a.x+b.x,-a.y+b.y); }
  static dP nyax(dP a,dP b) { return new dP(a.x+b.x,-a.y); }
  static dP nyay(dP a,dP b) { return new dP(a.x,-a.y+b.y); }
  static dP nym(dP a,dP b) { return new dP(a.x-b.x,-a.y-b.y); }
  static dP nymx(dP a,dP b) { return new dP(a.x-b.x,-a.y); }
  static dP nymy(dP a,dP b) { return new dP(a.x,-a.y-b.y); }
  static dP nyam(dP a,dP b) { return new dP(a.x+b.x,-a.y-b.y); }
  static dP nyma(dP a,dP b) { return new dP(a.x-b.x,-a.y+b.y); }
  dP ae(double a,double b) 
   {
    x+=a;
    y+=b;
    com();
    return this;
   }
  dP ae(dP dp)
   {
    x+=dp.x;
    y+=dp.y;
    com();
    return this;
   }
  dP me(dP dp)
   {
    x-=dp.x;
    y-=dp.y;
    com();
    return this;
   }
  dP me(double a,double b) 
   {
    x-=a;
    y-=b;
    com();
    return this;
   }
  dP sub(double xx,double yy) { return new dP(x-xx,y-yy); }
  dP sub(dP dp) { return new dP(x-dp.x,y-dp.y); }
  dP sym(dP dp) { return new dP(2*x-dp.x,2*y-dp.y); }
  dP sym(double xx,double yy) { return new dP(2*x-xx,2*y-yy); }
  dP nadd(double xx,double yy) { return new dP(-x+xx,-y+yy); }
  dP n() { return new dP(-x,-y); }
  dP nx() { return new dP(-x,y); }
  dP ny() { return new dP(x,-y); }
  public static dP sub(dP a,dP b) { return new dP(a.x-b.x,a.y-b.y); }
  public static dP add(dP a,dP b) { return new dP(a.x+b.x,a.y+b.y); }
  public static double dist(dP dp1,dP dp2) { return Math.pow( Math.pow(dp1.x-dp2.x,2)+Math.pow(dp1.y-dp2.y,2),.5); }
  double dist(double xx,double yy) { return Math.pow( Math.pow(xx-x,2)+Math.pow(yy-y,2),.5); }
  double angto(double xx,double yy) { return RD*Math.atan2(yy-y,xx-x); }
  double angfr(double xx,double yy) { return RD*Math.atan2(y-yy,x-xx); }
  dP de(dP s)
   {
    x/=s.x;
    y/=s.y;
    com();
    return this;
   }
  dP scale(dP s)
   {
    x*=s.x;
    y*=s.y;
    com();
    return this;
   }
  dP scale(double s)
   {
    x*=s;
    y*=s;
    com();
    return this;
   }
  dP scale(double a,double b)
   {
    x*=a;
    y*=b;
    com();
    return this;
   }
  static dP avdP(dP dp1,dP dp2) { return new dP((dp1.x+dp2.x)/2,(dp1.y+dp2.y)/2); }
  static Point avP(Point p1,Point p2) { return new Point((int)((p1.x+p2.x)/2),(int)((p1.y+p2.y)/2)); }
  dP scxy(double scx,double scy) { return new dP(x*scx,y*scy); }
  dP offxyscxy(double ofx,double ofy,double scx,double scy) { return new dP((x+ofx)*scx,(y+ofy)*scy); }
  dP scxyoffxy(double scx,double scy,double ofx,double ofy) { return new dP(ofx+x*scx,ofy+y*scy); }
  public Point P()
   {
    com();
    return p;
   }
  public void setLocation(double dx, double dy)
   {
    x=dx;
    y=dy;
    com();
   }
  public dP sp(Point p,dP dp)
   {
    return new dP(p.x-dp.x/2,dp.y/2-p.y);
   }
  public dP sp(Point p)
   {
    return new dP(p.x-x/2,y/2-p.y);
   }
  public double getX() { return x; }
  public double getY() { return y; }
  public static dP snap(dP a,double d)
   {
    return new dP(d*Math.rint(a.x/d),d*Math.rint(a.y/d));
   }
  public static boolean equals(dP a,dP b)
   {
    if(a.x==b.x && a.y==b.y) return true;
    return false;
   }
  public static boolean dPac(dP[] a,dP dp)
   {
    for(int i=0;i<a.length;i++)
     {
      if(dP.equals(a[i],dp)) return true;
     }
    return false;
   }
  public static dP[] dPardp(dP[] a,dP dp)
   {
    for(int i=0;i<a.length;i++)
     {
      if(dP.equals(a[i],dp)) return dPari(a,i);
     }
    return a;
   }
  public static dP[] dPari(dP[] a,int i)
   {
    int nl=a.length-1;
    dP[] b= new dP[nl];
    for(int j=0;j<i;j++) b[j]=a[j];
    for(int j=i;j<nl;j++) b[j]=a[j+1];
    return b;
   }
  public static dP[] dPaie(dP[] a,int i,dP dp)
   {
    int nl=a.length+1;
    dP[] b= new dP[nl];
    for(int j=0;j<i;j++) b[j]=a[j];
    b[i]=dp;
    for(int j=i+1;j<nl;j++) b[j]=a[j-1];
    return b;
   }
  public static double rand(dP a)
   {
    return  a.x + Math.random() * ( a.y-a.x );
   }
 }
