计算几何的题目,很简单;
自己随手敲了个,纪念下!
1 #include2 #include 3 using namespace std; 4 5 struct point 6 { 7 double x,y; 8 point(double x=0,double y=0):x(x),y(y) { } 9 } a,b,c,d;10 11 point midd(point a,point b)12 {13 return point((a.x+b.x)/2.0,(a.y+b.y)/2.0);14 }15 point operator + (point a,point b)16 {17 return point(a.x+b.x,a.y+b.y);18 }19 point operator - (point a,point b)20 {21 return point(a.x-b.x,a.y-b.y);22 }23 point operator * (point a,double p)24 {25 return point(a.x*p,a.y*p);26 }27 point operator / (point b,double p)28 {29 return point(a.x/p,a.y/p);30 }31 double cross(point a,point b)32 {33 return a.x*b.y-b.x*a.y;34 }35 point getlineintersection(point p,point v,point q,point w)36 {37 point u=p-q;38 double t=cross(w,u)/cross(v,w);39 return p+v*t;40 }41 double area(point a,point b,point c)42 {43 return cross(b-a,c-a)/2.0;44 }45 double dis(point a,point b)46 {47 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));48 }49 double line(point a,point b,point c,point d)50 {51 return dis(a,b)+dis(b,c)+dis(c,d)+dis(d,a);52 }53 54 55 int main()56 {57 int t,ca;58 scanf("%d",&t);59 while(t--)60 {61 scanf("%d",&ca);62 printf("%d ",ca);63 a.x=0.0,a.y=0.0,b.y=0.0;64 scanf("%lf%lf%lf%lf%lf",&b.x,&c.x,&c.y,&d.x,&d.y);65 point dd=midd(a,b);66 point aa=midd(b,c);67 point cc=midd(a,d);68 point bb=midd(c,d);69 point aaa=getlineintersection(d,d-dd,a,a-aa);70 point bbb=getlineintersection(a,aa-a,b,bb-b);71 point ccc=getlineintersection(c,cc-c,b,bb-b);72 point ddd=getlineintersection(c,cc-c,d,dd-d);73 printf("%.3lf ",area(a,b,bbb)/160.0);74 printf("%.3lf ",area(b,c,ccc)/160.0);75 printf("%.3lf ",area(c,d,ddd)/160.0);76 printf("%.3lf ",area(d,a,aaa)/160.0);77 printf("%.3lf ",((area(ddd,aaa,bbb)+area(bbb,ccc,ddd))/160.0));78 printf("%.0lf\n",ceil(line(aaa,bbb,ccc,ddd)*16.5));79 }80 return 0;81 }