题意:给出 飞机的速度 和子弹的速度 问子弹是否可以打到飞机
思路 :就是判断点是否在多边形中 套一下模版就可以了
代码:
#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;
}