首页 > 代码库 > poj1673EXOCENTER OF A TRIANGLE

poj1673EXOCENTER OF A TRIANGLE

链接

据说这题是垂心。。数学太弱没有看出来,写了分朴实无华的代码。。

旋转三边得到图中的外顶点,然后连接三角形顶点求交点,交上WA。。觉得没什么错误就去看了下discuss,发现都在说精度问题,果断开始水,最后+了epsAC了。。

  1 #include <iostream>  2 #include<cstdio>  3 #include<cstring>  4 #include<algorithm>  5 #include<stdlib.h>  6 #include<vector>  7 #include<cmath>  8 #include<queue>  9 #include<set> 10 using namespace std; 11 #define N 100000 12 #define LL long long 13 #define INF 0xfffffff 14 const double eps = 1e-8; 15 const double pi = acos(-1.0); 16 const double inf = ~0u>>2; 17 struct Point 18 { 19     double x,y; 20      Point(double x=0,double y=0):x(x),y(y) {} 21 }p[5]; 22 typedef Point pointt; 23 pointt operator + (Point a,Point b) 24 { 25     return Point(a.x+b.x,a.y+b.y); 26 } 27 pointt operator - (Point a,Point b) 28 { 29     return Point(a.x-b.x,a.y-b.y); 30 } 31 int dcmp(double x) 32 { 33     if(fabs(x)<eps) return 0; 34     else return x<0?-1:1; 35 } 36 Point rotate(Point a,double rad) 37 { 38     return Point(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad)); 39 } 40 bool intersection1(Point p1, Point p2, Point p3, Point p4, Point& p)      // 直线相交 41 { 42     double a1, b1, c1, a2, b2, c2, d; 43     a1 = p1.y - p2.y; 44     b1 = p2.x - p1.x; 45     c1 = p1.x*p2.y - p2.x*p1.y; 46     a2 = p3.y - p4.y; 47     b2 = p4.x - p3.x; 48     c2 = p3.x*p4.y - p4.x*p3.y; 49     d = a1*b2 - a2*b1; 50     if (!dcmp(d))    return false; 51     p.x = (-c1*b2 + c2*b1) / d; 52     p.y = (-a1*c2 + a2*c1) / d; 53     return true; 54 } 55 double cross(Point a,Point b) 56 { 57     return a.x*b.y-a.y*b.x; 58 } 59 double mul(Point p0,Point p1,Point p2) 60 { 61     return cross(p1-p0,p2-p0); 62 } 63 int main() 64 { 65     int n,i; 66     cin>>n; 67     while(n--) 68     { 69         for(i = 1; i <= 3 ; i++) 70         scanf("%lf%lf",&p[i].x,&p[i].y); 71         Point p1,p2,p3,p4; 72         if(dcmp(mul(p[1],p[2],p[3]))>0) 73         { 74             p1 = rotate(p[3]-p[1],3*pi/2.0); 75             p2 = rotate(p[2]-p[1],pi/2.0); 76         } 77         else 78         { 79             p1 = rotate(p[3]-p[1],pi/2.0); 80             p2 = rotate(p[2]-p[1],3*pi/2.0); 81         } 82         p1.x+=p[1].x; 83         p1.y+=p[1].y; 84         p2.x+=p[1].x; 85         p2.y+=p[1].y; 86         p1.x = (p1.x+p2.x)/2; 87         p1.y = (p1.y+p2.y)/2; 88  89         if(dcmp(mul(p[2],p[1],p[3]))>0) 90         { 91             p3 = rotate(p[3]-p[2],3*pi/2.0); 92             p4 = rotate(p[1]-p[2],pi/2.0); 93         } 94         else 95         { 96             p3 = rotate(p[3]-p[2],pi/2.0); 97             p4 = rotate(p[1]-p[2],3*pi/2.0); 98         } 99         p3.x+=p[2].x;100         p3.y+=p[2].y;101         p4.x+=p[2].x;102         p4.y+=p[2].y;103         p3.x = (p3.x+p4.x)/2;104         p3.y = (p3.y+p4.y)/2;105         Point pp ;106         intersection1(p1,p[1],p3,p[2],pp);107         printf("%.4f %.4f\n",pp.x+eps,pp.y+eps);108 109     }110     return 0;111 }
View Code