题意:给出 飞机的速度 和子弹的速度 问子弹是否可以打到飞机
思路 :就是判断点是否在多边形中 套一下模版就可以了
代码:
#include <iostream> #include <cmath> using namespace std; const double eps=1e-9; double v,g,b; int n; struct Point { double x,y; Point(){} Point(double x,double y):x(x),y(y){} Point operator-(const Point&p){return Point(x-p.x,y-p.y);} }; Point poly[30]; double Cross(Point a,Point b){return a.x*b.y-a.y*b.x;} int dcmp(double x) { if(fabs(x)<eps) return 0; return x<0?-1:1; } bool OnSegment(Point p,Point a,Point b) { if(dcmp(Cross(p-a,p-b)))return 0; return dcmp(a.x-p.x)*dcmp(b.x-p.x)<=0&&dcmp(a.y-p.y)*dcmp(b.y-p.y)<=0; //利用dcmp判断,避免使用Dot } int isPointInPolygon(Point p) { int wn = 0; for(int i = 0; i < n; i++) { if(OnSegment(p, poly[i], poly[(i+1)%n])) return -1; //在边界上 int k = dcmp(Cross(poly[(i+1)%n]-poly[i], p-poly[i])); int d1 = dcmp(poly[i].y - p.y); int d2 = dcmp(poly[(i+1)%n].y - p.y); if(k > 0 && d1 <= 0 && d2 > 0) wn++; if(k < 0 && d2 <= 0 && d1 > 0) wn--; } if(wn != 0) return 1; //内部 return 0; //外部 } int main(int argc, const char * argv[]) { Point a; while (scanf("%lf%lf%lf",&v,&b,&g)==3) { if (fabs(v<eps&&fabs(b)<eps&&fabs(g)<eps)) { break; } v=-v; scanf("%d",&n); for (int i=0; i<n; ++i) { scanf("%lf%lf",&poly[i].x,&poly[i].y); } bool is=false; double t=0; for (; ;t+=0.001) { a.x=v*t,a.y=b*t-0.5*g*t*t; if(fabs(a.x)>100||(a.y>100)||a.y<0) { break; } if (isPointInPolygon(a)>0) { is=1; printf("%.2lf\n",t); break; } } if (!is) { puts("Miss!"); } } return 0; }