http://acm.hust.edu.cn/vjudge/contest/view.action?cid=77223#problem/E
只满足锐角三角形和直角三角形:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#define INF 0x3f3f3f3f
using namespace std;
int main (){
int n;
cin>>n;
int Coun=1;
while(n--){
double x[3],y[3],X,Y;
for(int i=0;i<3;i++) cin>>x[i]>>y[i];
cin>>X>>Y;
printf("Case #%d:
",Coun);
Coun++;
double k1,k2,b1,b2,tx,ty;
if(y[0]==y[1])
k1=1.0e100,b1=(x[0]+x[1])/2;
else{
k1=-1/((y[0]-y[1])/(x[0]-x[1]));
tx=(x[0]+x[1])/2,ty=(y[0]+y[1])/2;
b1=ty-k1*tx;
}
if(y[0]==y[2])
k2=1.0e100,b2=(x[0]+x[2])/2;
else{
k2=-1/((y[0]-y[2])/(x[0]-x[2]));
tx=(x[0]+x[2])/2,ty=(y[0]+y[2])/2;
b2=ty-k2*tx;
}
cout<<k1<<" "<<b1<<" "<<k2<<" "<<b2<<endl;
if(k1!=1.0e100&&k2!=1.0e100){
if(k1==0&&k2==0){
double maxx=max(x[0],x[1]);
maxx=max(maxx,x[2]);
double minn=max(x[0],x[1]);
minn=max(minn,x[2]);
ty=y[0],tx=(maxx-minn)/2;
}
else{
tx=(b2-b1)/(k1-k2);
ty=((b1*k2)-(b2*k1))/(k2-k1);
}
}
else if(k1==1.0e100&&k2==1.0e100){
double maxy=max(y[0],y[1]);
maxy=max(maxy,y[2]);
double minn=max(y[0],y[1]);
minn=max(minn,y[2]);
ty=y[0],tx=(maxy-minn)/2;
}
else if(k1==1.0e100){
tx=b1;
ty=k2*tx+b2;
}
else if(k2==1.0e100){
tx=b2;
ty=k1*tx+b1;
}
cout<<tx<<" "<<ty<<endl;
string str=sqrt((tx-X)*(tx-X)+(ty-Y)*(ty-Y)) > sqrt((tx-x[0])*(tx-x[0])+(ty-y[0])*(ty-y[0]))? "Safe" :"Danger";
cout<<str<<endl;
}
return 0;
}
需利用三角关系进行判断: