POJ 1673 EXOCENTER OF A TRIANGLE

POJ_1673

    O实际上是△ABC的垂心,证明如下:

    先将△EBJ绕B点逆时针旋转90度,这时EB与AB重合,BJ与BC共线。之所以BJ与BC共线是因为∠ABC和∠EBJ之前是互补的。这时,就会出现一个大的组合而成的三角形△JAC,同时BC=BJ,ME=MJ,所以ME是△JAC的中位线,因此BM平行于AC。而BM是旋转90度之后平行于AC的,于是之前BM就是垂直于AC的了,进而就可以得到O是△ABC的垂心。

    这个题目输出的时候需要加一个很小的量(eps)比如1e-8然后再输出,至于为什么这个样子我也搞不懂,看discuss说做计算几何题输出结果的时候最好顺手加个eps,囧。

#include<stdio.h>
#include<string.h>
#include<math.h>
#define zero 1e-8
double x3, y3, x4, y4, x5, y5;
int dcmp(double x)
{
return fabs(x) < zero ? 0 : (x < 0 ? -1 : 1);
}
void solve()
{
double x, y, x1, y1, x2, y2, k1, k2;
if(dcmp(y3 - y4) == 0)
{
k2 = (x4 - x5) / (y5 - y4);
x = x5;
y = k2 * (x - x3) + y3;
}
else
{
if(dcmp(y4 - y5) == 0)
{
k1 = (x3 - x4) / (y4 - y3);
x = x3;
y = k1 * (x - x5) + y5;
}
else
{
k1 = (x3 - x4) / (y4 - y3);
k2 = (x4 - x5) / (y5 - y4);
x = (k1 * x5 - k2 * x3 + y3 - y5) / (k1 - k2);
y = k1 * (x - x5) + y5;
}
}
printf("%.4lf %.4lf\n", x + zero, y + zero);
}
int main()
{
int t;
scanf("%d", &t);
while(t --)
{
scanf("%lf%lf%lf%lf%lf%lf", &x3, &y3, &x4, &y4, &x5, &y5);
solve();
}
return 0;
}


你可能感兴趣的:(poj)