标签:计算几何
这道题就是求点的时候麻烦了点,思路还是很简单的
刚开始把向量反向写成了swap(x,y),其实应该是x=-x,y=-y
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
const double eps=1e-8;
struct Point {
double x,y;
Point(){}
Point(double xx,double yy){x=xx;y=yy;}
Point operator+(Point b){return Point(x+b.x,y+b.y);}
double operator^(const Point b)const{
return x*b.y-y*b.x;
}
Point operator-(Point b){return Point(x-b.x,y-b.y);}
};
struct Line {
Point s,e;
Line(){};
Line(Point ss,Point ee){s=ss;e=ee;}
Point operator &(Line b){
Point res=s;
double t=((s-b.e)^(b.s-b.e))/((s-e)^(b.s-b.e));
res.x+=(e.x-s.x)*t;
res.y+=(e.y-s.y)*t;
return res;
}
};
double xmul(Point p0,Point p1,Point p2){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double dist(Point a,Point b){
return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}
Point getPoint(Point a,Point b,Point c){
Point q;
q=Point(-(b.y-a.y),b.x-a.x);
if(xmul(a,b,c)>eps) {
q.x=-q.x;
q.y=-q.y;
}
double d=dist(a,b);
q.x*=d/sqrt(q.x*q.x+q.y*q.y);
q.y*=d/sqrt(q.x*q.x+q.y*q.y);
q.x=a.x+q.x;
q.y=a.y+q.y;
return q;
}
Point p[3];
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y);
Point c,d,r,q;
c=getPoint(p[0],p[1],p[2]);
d=getPoint(p[0],p[2],p[1]);
r=Point((c.x+d.x)/2,(c.y+d.y)/2);
c=getPoint(p[1],p[2],p[0]);
d=getPoint(p[1],p[0],p[2]);
q=Point((c.x+d.x)/2,(c.y+d.y)/2);
Point o;
o=Line(p[0],r)&Line(p[1],q);
printf("%.4f %.4f\n",o.x,o.y);
}
return 0;
}
POJ 1673 EXOCENTER OF A TRIANGLE
标签:计算几何
原文地址:http://blog.csdn.net/lj94093/article/details/43974587