点击打开链接
题意:
给A,B,C
求三分角平分线交的的D,E,F坐标
//大白p263 #include <cmath> #include <cstdio> #include <cstring> #include <set> #include <iostream> #include <vector> #include <algorithm> using namespace std; const double eps=1e-9;//精度 const int INF=1<<29; const double PI=acos(-1.0); int dcmp(double x){//判断double等于0或。。。 if(fabs(x)<eps)return 0;else return x<0?-1:1; } struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){} }; typedef Point Vector; Vector operator+(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}//向量+向量=向量 Vector operator-(Point a,Point b){return Vector(a.x-b.x,a.y-b.y);}//点-点=向量 Vector operator*(Vector a,double p){return Vector(a.x*p,a.y*p);}//向量*实数=向量 Vector operator/(Vector a,double p){return Vector(a.x/p,a.y/p);}//向量/实数=向量 bool operator<( const Point& A,const Point& B ){return dcmp(A.x-B.x)<0||(dcmp(A.x-B.x)==0&&dcmp(A.y-B.y)<0);} bool operator==(const Point&a,const Point&b){return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;} bool operator!=(const Point&a,const Point&b){return a==b;} struct Segment{ Point a,b; Segment(){} Segment(Point _a,Point _b){a=_a,b=_b;} bool friend operator<(const Segment& p,const Segment& q){return p.a<q.a||(p.a==q.a&&p.b<q.b);} bool friend operator==(const Segment& p,const Segment& q){return (p.a==q.a&&p.b==q.b)||(p.a==q.b&&p.b==q.a);} }; struct Circle{ Point c; double r; Circle(){} Circle(Point _c, double _r):c(_c),r(_r) {} Point point(double a)const{return Point(c.x+cos(a)*r,c.y+sin(a)*r);} bool friend operator<(const Circle& a,const Circle& b){return a.r<b.r;} }; struct Line{ Point p; Vector v; double ang; Line() {} Line(const Point &_p, const Vector &_v):p(_p),v(_v){ang = atan2(v.y, v.x);} bool operator<(const Line &L)const{return ang < L.ang;} }; double Dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}//|a|*|b|*cosθ 点积 double Length(Vector a){return sqrt(Dot(a,a));}//|a| 向量长度 double Angle(Vector a,Vector b){return acos(Dot(a,b)/Length(a)/Length(b));}//向量夹角θ double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}//叉积 向量围成的平行四边形的面积 double Area2(Point a,Point b,Point c){return Cross(b-a,c-a);}//同上 参数为三个点 double DegreeToRadius(double deg){return deg/180*PI;} double torad(double deg){return deg/180*PI;}//角度化为弧度 Point GetLineIntersection(Point p,Vector v,Point q,Vector w){//求直线交点 有唯一交点时可用 Vector u=p-q; double t=Cross(w,u)/Cross(v,w); return p+v*t; } Vector Rotate(Vector a,double rad){//向量逆时针旋转rad弧度 return Vector(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad)); } //-------------------------------------- //-------------------------------------- //-------------------------------------- //-------------------------------------- //-------------------------------------- int main(){ int T; scanf("%d",&T); while(T--){ Point a,b,c,d,e,f; scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y); double aa,ab,ac; aa=Angle(b-a,c-a); ab=Angle(a-b,c-b); ac=Angle(b-c,a-c); d=GetLineIntersection(b,Rotate(c-b,ab/3),c,Rotate(a-c,ac/3*2)); e=GetLineIntersection(a,Rotate(b-a,aa/3*2),c,Rotate(a-c,ac/3)); f=GetLineIntersection(a,Rotate(b-a,aa/3),b,Rotate(c-b,ab/3*2)); printf("%lf %lf %lf %lf %lf %lf\n",d.x,d.y,e.x,e.y,f.x,f.y); } return 0; }