【模板】三角形四心

  1 #include<iostream>
  2 #include<cmath>
  3 #include<cstdio>
  4 using namespace std;
  5 struct Point{
  6     double x,y;
  7     Point operator - (const Point& b)const{
  8         return (Point){x-b.x,y-b.y};
  9     }
 10     double operator ^ (const Point& b)const{
 11         return x*b.y - b.x*y;
 12     }
 13     Point operator * (const double b){
 14         return (Point){x*b,y*b};
 15     }
 16     Point operator + (const Point& b)const{
 17         return (Point){x+b.x,y+b.y};
 18      }
 19 };
 20 struct Line{
 21     Point s,t;
 22 };
 23 //直线交
 24 Point line_inter(Line l1,Line l2){
 25     double b = ((l1.t-l1.s)^(l2.s-l1.s))/((l2.t-l2.s)^(l1.t-l1.s));
 26     return l2.s + (l2.t - l2.s)*b;
 27 }
 28 double dis(Point a,Point b){
 29     return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
 30 }
 31 //外心
 32 Point circumcenter(Point a, Point b, Point c){
 33     Line u, v;
 34     u.s.x = (a.x + b.x) / 2;
 35     u.s.y = (a.y + b.y) / 2;
 36     u.t.x = u.s.x - a.y + b.y;
 37     u.t.y = u.s.y + a.x - b.x;
 38     v.s.x = (a.x + c.x) / 2;
 39     v.s.y = (a.y + c.y) / 2;
 40     v.t.x = v.s.x - a.y + c.y;
 41     v.t.y = v.s.y + a.x - c.x;
 42     return line_inter(u, v);
 43 }
 44  
 45 //内心
 46 Point incenter(Point a,Point b,Point c){  //三角形内心 
 47      double A=dis(b,c);
 48      double B=dis(a,c);
 49      double C=dis(a,b);
 50      double S=A+B+C; 
 51      double u=(A*a.x+B*b.x+C*c.x)/S;
 52      double v=(A*a.y+B*b.y+C*c.y)/S;
 53      return (Point){u,v};    
 54 }
 55  
 56 //垂心
 57 Point perpencenter(Point a, Point b, Point c){
 58     Line u, v;
 59     u.s = c;
 60     u.t.x = u.s.x - a.y + b.y;
 61     u.t.y = u.s.y + a.x - b.x;
 62     v.s = b;
 63     v.t.x = v.s.x - a.y + c.y;
 64     v.t.y = v.s.y + a.x - c.x;
 65     return line_inter(u, v);
 66 }
 67  
 68 //重心
 69 //三条中线交点 
 70 //到三角形三顶点距离的平方和最小的点
 71 //三角形内到三边距离之积最大的点
 72 Point gravity(Point a, Point b, Point c){
 73     return (Point){(a.x+b.x+c.x)/3,(a.y+b.y+c.y)/3};
 74 }
 75  
 76 //费马点
 77 //到三角形三顶点距离之和最小的点
 78 Point fermentpoint(Point a, Point b, Point c){
 79     Point u, v;
 80     double step = fabs(a.x) + fabs(a.y) + fabs(b.x) + fabs(b.y) + fabs(c.x) + fabs(c.y);
 81     int i, j, k;
 82     u.x = (a.x + b.x + c.x) / 3;
 83     u.y = (a.y + b.y + c.y) / 3;
 84     while (step > 1e-10)
 85         for (k = 0; k < 10; step /= 2, k++)
 86             for (i = -1; i <= 1; i++)
 87                 for (j = -1; j <= 1; j++){
 88                     v.x = u.x + step*i;
 89                     v.y = u.y + step*j;
 90                     if (dis(u, a) + dis(u, b) + dis(u, c) > dis(v, a) + dis(v, b) + dis(v, c))
 91                         u = v;
 92                 }
 93                 return u;
 94 }
 95 int main(){
 96     int T; scanf("%d",&T);
 97     Point a,b,c;
 98     while(T--){
 99         cin>>a.x>>a.y;
100         cin>>b.x>>b.y;
101         cin>>c.x>>c.y;
102         Point ans = perpencenter(a,b,c);
103         printf("%.4f %.4f\n",ans.x,ans.y);
104     }
105     return 0;
106 } 
View Code

 

posted @ 2019-10-04 12:29  小布鞋  阅读(189)  评论(0编辑  收藏  举报