烦恼的中学生
总提交:86 测试通过:41
描述
很多学生都会找点兼职来赚点外快,Alfred也不例外,他找的兼职是家教。好了,现在Alfred的工作就是辅导一个高中生的数学。
这一天,这位高中生叫Alfred帮忙做一下作业:在二维平面内给出一个三角形的三个顶点坐标,现在的任务是求出这个三角形的垂心,也就是三角形的三条高线所在直线的交点。
当然,Alfred的数学是不错的,对于这么简单的问题,Alfred只用了半分钟就解决掉了,正当Alfred得意的时候,这位高中生却毫不吃惊地说:我们的作业一共有100条呢! Alfred听见了之后不禁倒抽了一口凉气,现在的中学生真命苦啊。
所以,打抱不平的Alfred决定要帮这位高中生的忙:利用计算机程序来批量解决这个问题,但是Alfred苦思数日却没有想出来解决办法,你们能帮他这个忙吗?
输入
第一行是一个整数C(C<=100),表示有C组测试数据,每组数据三行,每行两个浮点数分别表示三角形某个顶点的x,y坐标。所有坐标的绝对值<10000。输入保证三点不共线。
输出
对于每组输入数据,输出两个浮点数xh, yh表示所给三角形垂心的纵横坐标,保留三位小数(四舍五入)。
样例输入
3
-10 0
0 10
10 0
-10 0
10 0
0 17.321
2 10
4 -5
20 6
样例输出
0.000 10.000
0.000 5.774
6.031 4.137
提示
请注意你的程序,避免输出-0.000的情况,这样系统会判错。(如果要输出一个极小的负数,如-0.000001,输出会变成-0.000,应该手动排除这种情况,确保这种时候输出0.000。)
题目来源
Internet
分析:此题求高线的交点。一开始看成中垂线了。 = = 即垂直于2个点,并且通过第三个点。
用 y = k*x+b 的表达式比较好做。
#include<iostream>
#include<cmath>
using namespace std;
//烦恼的中学生——高线Not中垂线 = =
struct Point
{
double x, y;
};
double fun(double x)
{
//if(fabs(x) < 0.001)
if(x < 0 && x > -0.001)
return 0;
else
return x;
}
int main()
{
int n;
Point a, b, c, jiao;
scanf("%d",&n);
while(n --)
{
scanf("%lf%lf",&a.x,&a.y);
scanf("%lf%lf",&b.x,&b.y);
scanf("%lf%lf",&c.x,&c.y);
if(a.y != c.y && b.y != c.y)
{
double k1 = (c.x-b.x)/(b.y-c.y);
double k2 = (c.x-a.x)/(a.y-c.y);
//jiao.x = ( (a.y-b.y)/2 + (b.x+c.x)/2*k1 -(a.x+c.x)/2*k2 ) / (k1-k2);
//jiao.y = k1*jiao.x + (b.y+c.y)/2-k1*(b.x+c.x)/2;
jiao.x = (b.y-b.x*k2-a.y+a.x*k1) / (k1-k2);
jiao.y = k1*(jiao.x-a.x) + a.y;
}
else if(a.y == c.y)
{
double k1 = (c.x-b.x)/(b.y-c.y);
jiao.x = (a.x+c.x) / 2;
jiao.y = k1*(jiao.x-a.x) + a.y;
}
else // b.y == c.y
{
double k2 = (c.x-a.x)/(a.y-c.y);
jiao.x = (b.x+c.x) / 2;
jiao.y = k2*(jiao.x-b.x) + b.y;
}
fun(jiao.x);
fun(jiao.y);
printf("%.3f %.3f\n",jiao.x,jiao.y);
}
return 0;
}