题目链接:点击打开链接
2 1.62 0.1 10.0 10.0 10.0 1.80 0.09 0.0 0.0 0.0 1.0 1.0 1.0 1.62 0.1 0.0 0.0 0.0 1.80 0.09 10.0 10.0 10.0 -1.0 -1.0 -1.0
YES YES
题意就不用多说了吧。注意警察的身高。
不学高数一年了,空间几何全忘了TUT...本来想用叉乘的结果愣是没想起来叉乘是咋用的。最后无奈用了数量积求。
假设a=(x1,y1,z1),b=(x2,y2,z2) a*b=x1x2+y1y2+z1z2 |a|=√(x1^2+y1^2+z1^2).|b|=√(x2^2+y2^2+z2^2) cosθ=a*b/(|a|*|b|)
这条公式可以求出空间任意两向量的之间的夹角 ,然后就好办了,做切线再比角度就好了。注意角度越大cos越小。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; #define eps 1e-8 struct people { double h,r,x,y,z; }; int main() { int T; double x,y,z,a,b; people p,q; scanf("%d",&T); while(T--) { scanf("%lf %lf %lf %lf %lf",&p.h,&p.r,&p.x,&p.y,&p.z); scanf("%lf %lf %lf %lf %lf %lf %lf %lf",&q.h,&q.r,&q.x,&q.y,&q.z,&x,&y,&z); q.z+=q.h*0.9-q.r; p.z+=p.h-p.r; double d=sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y)+(p.z-q.z)*(p.z-q.z)); double d1=sqrt(d*d-p.r*p.r); a=d1/d; double qpx=p.x-q.x,qpy=p.y-q.y,qpz=p.z-q.z; double num=qpx*x+qpy*y+qpz*z; double d2=sqrt(qpx*qpx+qpy*qpy+qpz*qpz); double d3=sqrt(x*x+y*y+z*z); b=num/(d2*d3); if(a-b<eps) printf("YES\n"); else printf("NO\n"); } return 0; }