■0129 Hide-and-Seek Supporting System
鬼-たろう君からなる直線と円の交点を求めて,交点が鬼-たろう君からなる線分上に存在するかを判定するだけ.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n, m; P[] cs; int[] rs; P t, s; void run(){ for(;;){ n=sc.nextInt(); if(n==0){ break; } cs=new P[n]; rs=new int[n]; for(int i=0; i<n; i++){ int x=sc.nextInt(); int y=sc.nextInt(); rs[i]=sc.nextInt(); cs[i]=new P(x, y); } m=sc.nextInt(); for(int i=0; i<m; i++){ int tx=sc.nextInt(); int ty=sc.nextInt(); int sx=sc.nextInt(); int sy=sc.nextInt(); t=new P(tx, ty); s=new P(sx, sy); solve(); } } } void solve(){ boolean safe=false; for(int i=0; i<n; i++){ P[] ps=isCL(cs[i], rs[i], t, s); for(P p : ps){ if(between(t.x, s.x, p.x)&&between(t.y, s.y, p.y)){ safe=true; } } } println(safe?"Safe":"Danger"); } boolean between(double x1, double x2, double x){ return (x1<x+EPS&&x<x2+EPS)||(x1+EPS>x&&x+EPS>x2); } P[] isCL(P c, double r, P p1, P p2){ double x=p1.sub(c).dot(p2.sub(p1)); double y=p2.sub(p1).abs2(); double d=x*x-y*(p1.sub(c).abs2()-r*r); if(d<-EPS) return new P[0]; if(d<0) d=0; P q1=p1.sub(p2.sub(p1).mul(x/y)); P q2=p2.sub(p1).mul(Math.sqrt(d)/y); return new P[]{q1.sub(q2), q1.add(q2)}; } class P{ double x, y; P(){ this(0, 0); } P(double x, double y){ this.x=x; this.y=y; } P add(P p){ return new P(x+p.x, y+p.y); } P sub(P p){ return new P(x-p.x, y-p.y); } P mul(double m){ return new P(x*m, y*m); } P div(double d){ return new P(x/d, y/d); } double abs(){ return Math.sqrt(abs2()); } double abs2(){ return x*x+y*y; } double arg(){ return Math.atan2(y, x); } // inner product double dot(P p){ return x*p.x+y*p.y; } // outer product double det(P p){ return x*p.y-y*p.x; } P rot90(){ return new P(-y, x); } // conjugation P conj(){ return new P(x, -y); } } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
0 件のコメント:
コメントを投稿