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*/
上一篇: 四川火锅的荤菜有哪些
下一篇: 简单火锅底料炒面
推荐阅读
-
The 2019 ICPC Asia Shanghai Regional Contest · K Color Graph · 二分图定义
-
2019南京icpc K - Triangle
-
2019 ICPC 南京 K.Triangle(二分+几何)
-
2018 ICPC南京区域赛 K .Kangaroo Puzzle
-
2018南京ICPC Problem K. Kangaroo Puzzle(乱搞)
-
2019 ICPC Asia Nanjing Regional K. Triangle(计算几何+二分)
-
2018icpc南京 Problem K. Kangaroo Puzzle
-
19 南京 icpc K. Triangle//计算几何+分类讨论模拟+二分