2019南京icpc K - Triangle

2019南京icpc K - Triangle

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const double eps=1e-7;
const int M=50,mod=1e9+7;
int n;
double px,py;
int main() {
	cin>>n;
	double x1,y1,x2,yy,x3,y3,x,y;
	while(n--) {
		scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&yy,&x3,&y3,&px,&py);
		//1 2--3   1 3--2   2 3--1
		if(px==x1&&py==y1) {//点在顶点1上,答案点是对边(2----3)的中点 
			x=(x2+x3)/2;
			y=(yy+y3)/2;
		} else if(px==x2&&py==yy) {//点在顶点2上,答案点是对边(1----3)的中点 
			x=(x1+x3)/2;
			y=(y1+y3)/2;
		} else if(px==x3&&py==y3) {//点在顶点3上,答案点是对边(1----2)的中点 
			x=(x2+x1)/2;
			y=(yy+y1)/2;
		} else {
			if((x1-x2)*(y1-py)==(y1-yy)*(x1-px)&&((x1-px<=x1-x2&&x1>=px&&x1>=x2)||(x1-px>=x1-x2&&x1<=px&&x1<=x2))) {
				//判断点是否在边 1-----2 上 
				//cout<<'1'<<endl;
				//判断点更靠近顶点1还是顶点2 
				if(fabs(x1-x2)<2*fabs(x1-px)||fabs(y1-yy)<2*fabs(y1-py)) {
					//点更靠近顶点2,答案点在边 1------3 上 
					//cout<<"11"<<endl;
					double t;
					if(x1==px&&y1!=py)
						t=(y1-yy)/(2*(y1-py));
					else
						t=(x1-x2)/(2*(x1-px));
					x=x1-t*x1+t*x3;
					y=y1-t*y1+t*y3;
				} else {
					//点更靠近顶点1,答案点在边 2------3 上
					//cout<<"12"<<endl;
					double t;
					if(x2==px)
						t=(yy-y1)/(2*(yy-py));
					else
						t=(x2-x1)/(2*(x2-px));
					x=x2-t*x2+t*x3;
					y=yy-t*yy+t*y3;
				}
			} else if((x1-x3)*(y1-py)==(y1-y3)*(x1-px)&&((x1-px<=x1-x3&&x1>=px&&x1>=x3)||(x1-px>=x1-x3&&x1<=px&&x1<=x3))) {
				//判断点是否在边 1-----3 上 
				//cout<<'2'<<endl;
				//判断点更靠近顶点1还是顶点3
				if(fabs(x1-x3)<2*fabs(x1-px)||fabs(y1-y3)<2*fabs(y1-py)) {
					//点更靠近顶点3,答案点在边 1------2 上
					//cout<<"21"<<endl;
					double t;
					if(x1==px)
						t=(y1-y3)/(2*(y1-py));
					else
						t=(x1-x3)/(2*(x1-px));
					x=x1-t*x1+t*x2;
					y=y1-t*y1+t*yy;
				} else {
					//点更靠近顶点1,答案点在边 3------2 上
					//cout<<"22"<<endl;
					double t;
					if(x3==px)
						t=(y3-y1)/(2*(y3-py));
					else
						t=(x3-x1)/(2*(x3-px));
					x=x3-t*x3+t*x2;
					y=y3-t*y3+t*yy;
				}
			} else if((x3-x2)*(y3-py)==(y3-yy)*(x3-px)&&((x3-px<=x3-x2&&x3>=px&&x3>=x2)||(x3-px>=x3-x2&&x3<=px&&x3<=x2))) {
				//判断点是否在边 3-----2 上 
				//cout<<'3'<<endl;
				//判断点更靠近顶点3还是顶点2
				if(fabs(x3-x2)<2*fabs(x3-px)||fabs(y3-yy)<2*fabs(y3-py)) {
					//cout<<"31"<<endl;
					//点更靠近顶点2,答案点在边 3------1 上
					double t;
					if(x3==px)
						t=(y3-yy)/(2*(y3-py));
					else
						t=(x3-x2)/(2*(x3-px));
					x=x3-t*x3+t*x1;
					y=y3-t*y3+t*y1;
				} else {
					//点更靠近顶点3,答案点在边 2------1 上
					//cout<<"32"<<endl;
					double t;
					if(x2==px)
						t=(yy-y3)/(2*(yy-py));
					else
						t=(x2-x3)/(2*(x2-px));
					x=x2-t*x2+t*x1;
					y=yy-t*yy+t*y1;
				}
			} else {
				printf("-1\n");
				continue;
			}
		}
		printf("%.15lf %.15lf\n",x,y);
	}
	return 0;
}
/*10
0 0 5 0 5 5 5 1
5 0 5 5 0 0 5 1
5 5 0 0 5 0 5 1
5 0 0 0 5 5 5 1
5 5 5 0 0 0 5 1
0 0 4 4 0 4 1 4
4 4 0 0 0 4 1 4
0 4 4 4 0 0 1 4*/
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值