欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019南京icpc K - Triangle

程序员文章站 2022-03-30 17:11:08
...

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*/
相关标签: c语言