UVA 478 Points in Figures: Rectangles, Circles, and Triangles

= =。。。模板啊 。。模板不理解套着真纠结。

 

这题是判断一个点在哪几个图形里,倍感JAVA的继承真好。。。可惜不会用C++的继承。。。

 

不过也不大,就10个图。。。我就每个图里存三个图形了。。

 

判断在图形内部(边界不算内部),我开始套得模板,但是模板是边界也算的。。悲剧了,改了改一直WA,索性自己写个判断的,3行就没了 = =。。。

 

用叉积判断,如果都是同一个方向的,那么就是在内部了,无语都。。

 

#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> using namespace std; const int MAX = 11; struct point { double x,y;}; struct r{ point p[5];}; struct c{ point a; double r;}; struct t{ point p[5];}; struct polygon{ char ch; r rr; c cc; t tt;}; polygon po[MAX]; const double eps = 1e-6; bool dy(double x,double y) { return x > y + eps;} // x > y bool xy(double x,double y) { return x < y - eps;} // x < y bool dyd(double x,double y) { return x > y - eps;} // x >= y bool xyd(double x,double y) { return x < y + eps;} // x <= y bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向 { return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y); } double disp2p(point a,point b) { return sqrt( ( a.x - b.x ) * ( a.x - b.x ) + ( a.y - b.y ) * ( a.y - b.y ) ); } bool pointin(point pot,point p[],int n) { for(int i=0; i<n; i++) if( xyd(crossProduct(p[i],p[(i+1)%n],pot)*crossProduct(p[(i+1)%n],p[(i+2)%n],pot),0.0) ) return false; return true; } int main() { int n = 0; point pot; char str[5]; while( ~scanf("%s",str) && str[0] != '*' ) { po[n].ch = str[0]; if( str[0] == 'r' ) { scanf("%lf%lf%lf%lf",&po[n].rr.p[0].x,&po[n].rr.p[0].y,&po[n].rr.p[2].x,&po[n].rr.p[2].y); po[n].rr.p[1].x = po[n].rr.p[0].x; po[n].rr.p[1].y = po[n].rr.p[2].y; po[n].rr.p[3].x = po[n].rr.p[2].x; po[n].rr.p[3].y = po[n].rr.p[0].y; n++; continue; } if( str[0] == 'c' ) { scanf("%lf%lf%lf",&po[n].cc.a.x,&po[n].cc.a.y,&po[n].cc.r); n++; continue; } for(int i=0; i<3; i++) scanf("%lf%lf",&po[n].tt.p[i].x,&po[n].tt.p[i].y); n++; } int ind = 0; while( ~scanf("%lf%lf",&pot.x,&pot.y) ) { ind++; if( dd(pot.y,9999.9) && dd(pot.x,9999.9) ) break; bool flag = false; for(int i=0; i<n; i++) { if( po[i].ch == 'r' && pointin(pot,po[i].rr.p,4) || po[i].ch == 'c' && xy( disp2p(pot,po[i].cc.a),po[i].cc.r) || po[i].ch == 't' && pointin(pot,po[i].tt.p,3) ) { flag = true; printf("Point %d is contained in figure %d/n",ind,i+1); } } if( !flag ) printf("Point %d is not contained in any figure/n",ind); } return 0; }

你可能感兴趣的:(java,c,struct,图形)