// // // // 座標系が画面座標系(左上が(0,0))であることに注意する // public final class Point { double x,y; // 10^-5以下は0と見なす. static final double EPS=10e-5; Point(double x,double y){ this.x=x; this.y=y; } public double getX() { return x;} public double getY() { return y;} public String toString(){ return "Point("+x+","+y+")"; } public double length(){ return Math.sqrt(x*x+y*y); } public double distance(Point p){ double dx=x-p.getX(),dy=y-p.getY(); return Math.sqrt(dx*dx+dy*dy); } public Point plus(Point p){ return new Point(x+p.getX(),y+p.getY()); } public Point minus(Point p){ return new Point(x-p.getX(),y-p.getY()); } public Point times(double r){ return new Point(x*r,y*r); } // ベクターの長さを newLengthに正規化する. public Point normal(double newLength){ double ratio=newLength/length(); return new Point(x*ratio,y*ratio); } // 2つの点の分割点を返す. // ratioが0の時は元の点.1の時は相手の点 public Point inter(Point p,double ratio){ return times(1-ratio).plus(p.times(ratio)); } // ベクトルの90度回転 public Point rot90(){ return new Point(y,-x); } // ベクトルの270度回転 public Point rot270(){ return new Point(-y,x); } // 自分とベクターpの内積(inner product) public double product(Point p){ return x*p.x+y*p.y; } // 自分からベクターpを見た角度の cos public double cosTheta(Point p){ return product(p)/(p.length()*length()); } // 自分からベクターpを見た角度の sin public double cosTheta(Point p){ return rot270().cosTheta(p); } // 自分からベクター p を見た角度 public double theta(Point p){ return Math.atan2(sinTheta(p),cosTheta(p)); } // 直線 p0-p1, p2-p3 の交点 // x = p0.x+t*(p1.x-p0.x) = p2.x+s*(p3.x-p2.x) // y = p0.y+t*(p1.y-p0.y) = p2.y+s*(p3.y-p2.y) public static Point cross(Point p0,Point p1,Point p2,Point p3){ double dy10=p1.y-p0.y,dx10=p1.x-p0.x; double d=dy10*(p3.x-p2.x)-dx10*(p3.y-p2.y); // 行列式が小さいときは null を返す. if(Math.abs(d)