题意:求多边形内是否存在一点,使该点能看到每一个边上的点:
思路:判断多边形是否存在核,求任意两个能相交边的交点,判断该交点是否在多边形内;;;
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <queue> #include <stack> using namespace std; const double INF = 1e20; const double EPS = 1e-12; bool zero(double t){return -EPS<t&&t<EPS;} struct cvector{ double x,y; cvector(double a,double b){x=a,y=b;} cvector(){} }; cvector operator- (cvector a,cvector b){ return cvector(a.x-b.x,a.y-b.y); } cvector operator+(cvector a,cvector b){ return cvector(a.x+b.x,a.y+b.y); } cvector operator*(double a,cvector b){ return cvector(a*b.x,a*b.y); } double operator*(cvector a,cvector b){ return a.x*b.x+a.y*b.y; } double operator^(cvector a,cvector b){ return a.x*b.y-b.x*a.y; } double length(double t){return t<0?-t:t;} double length(cvector t){return sqrt(t*t);} struct cpoint{ double x,y; void get(){scanf("%lf%lf",&x,&y);} } re[109]; cvector operator-(cpoint a,cpoint b){ return cvector(a.x-b.x,a.y-b.y); } double dist(cpoint a,cpoint b){ return length(a-b); } struct segline{ cpoint a,b; segline(cpoint x,cpoint y){a=x,b=y;} segline(){} }; cpoint intersection(segline u,segline v) { cpoint ret=u.a; double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))/ ((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x)); ret.x+=(u.b.x-u.a.x)*t; ret.y+=(u.b.y-u.a.y)*t; return ret; } int main() { freopen("in.txt","r",stdin); int n,cas; scanf("%d",&cas); while(cas--) { scanf("%d",&n); for(int i=0;i<n;i++) re[i].get(); re[n] = re[0]; int fin = 0; for(int i=0;i<n&&!fin;i++) for(int j=i+1;j<n&&!fin;j++) { if(!zero((re[j]-re[j+1])^(re[i]-re[i+1]))) { cpoint xx = intersection(segline(re[i],re[i+1]),segline(re[j],re[j+1])); // cout<<xx.x<<" "<<xx.y<<endl; int k; for(k=0;k<n;k++) { if(((re[k]-re[k+1])^(xx-re[k+1]))<-EPS) break; } if(k>=n) fin = 1; } } if(fin) printf("YES\n"); else printf("NO\n"); } return 0; }