http://acm.pku.edu.cn/JudgeOnline/problem?id=1673
题意归结到最后就是求三角形的锤心。由三角形的锤心公式可求得:
垂心:
A(x1,y1)B(x2,y2)C(x3,y3),垂心H(x0,y0)
用斜率是负倒数关系Kbc=y3-y2/x3-x2 Kah=y1-y0/x1-x0 Kah=-1/Kbc
得到方程(y3-y2)/(x3-x2)=-(x1-x0)/(y1-y0)
同理可得方程(y2-y1)/(x2-x1)=-(x3-x0)/(y3-y0)
解出x0,y0即可。
#include<iostream>
using namespace std;
struct point
{
double x,y;
};
struct line
{
point a,b;
};
point intersection(line u,line v)
{
point ret = u.a;
double t = ((u.a.x-v.a.x)*(v.a.y-v.b.y) - (u.a.y-v.a.y)*(v.a.x-v.b.x))
/ ((u.a.x-u.b.x)*(v.a.y-v.b.y) - (u.a.y-u.b.y)*(v.a.x-v.b.x));
ret.x += (u.b.x-u.a.x)*t;
ret.y += (u.b.y-u.a.y)*t;
return ret;
}
point perpencenter(point a,point b,point c)
{
line u,v;
u.a = c;
u.b.x = u.a.x-a.y+b.y;
u.b.y = u.a.y+a.x-b.x;
v.a = b;
v.b.x = v.a.x-a.y+c.y;
v.b.y = v.a.y+a.x-c.x;
return intersection(u,v);
}
int main()
{
int cas;
cin >> cas;
while(cas --)
{
point A,B,C;
scanf("%lf",&A.x);scanf("%lf",&A.y);
scanf("%lf",&B.x);scanf("%lf",&B.y);
scanf("%lf",&C.x);scanf("%lf",&C.y);
point ans;
ans = perpencenter(A,B,C);
printf("%0.4lf %0.4lf/n",ans.x,ans.y);
}
return 0;
}
/*
2
0.0 0.0
9.0 12.0
14.0 0.0
3.0 4.0
13.0 19.0
2.0 -10.0
9.0000 3.7500
-48.0400 23.3600
*/