模板三角形四心
Posted xiaobuxie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板三角形四心相关的知识,希望对你有一定的参考价值。
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
以上是关于模板三角形四心的主要内容,如果未能解决你的问题,请参考以下文章
模板计几旋转坐标(用于最小三角形以及三角形四边形面积存在性问题)