Morleys theorem states that that the linestrisecting the angles of an arbitrary planetriangle meet at the vertices of an equilateraltriangle. For example in the figurebelow thetri-sectors of angles A, B and Chas intersected and created an equilateraltriangle DEF.Of course the theorem has various generalizations,in particular if all of thetrisectorsare intersected one obtains fourother equilateral triangles. But in theoriginal theorem only tri-sectors nearestto BC are allowed to intersect to get pointD, tri-sectors nearest to CA are allowed to intersect point E and tri-sectors nearest to AB are intersectedto get point F. Trisector like BD and CE are not allowed to intersect. So ultimately we get onlyone equilateral triangle DEF. Now your task is to find the Cartesian coordinates of D, E and F giventhe coordinates of A, B, and C.
Input
First line of the input file contains an integer N (0 < N < 5001) which denotes the number of
test cases to follow. Each of the next lines contain six integers XA, YA, XB, YB, XC , YC . This six
integers actually indicates that the Cartesian coordinates of point A, B and C are (XA, YA),(XB, YB)
and (XC , YC ) respectively. You can assume that the area of triangle ABC is not equal to zero, 0 ≤
XA, YA, XB, YB, XC , YC ≤ 1000 and the points A, B and C are in counter clockwise order.
Output
For each line of input you should produce one line of output. This line contains six floating point
numbers XD, YD, XE, YE, XF , YF separated by a single space. These six floating-point actually means
that the Cartesian coordinates of D, E and F are (XD, YD),(XE, YE) ,(XF , YF ) respectively. Errors
less than 10−5 will be accepted.
Sample Input
2
1 1 2 2 1 2
0 0 100 0 50 50
Sample Output
Input
First line of the input file contains an integer N (0 < N < 5001) which denotes the number of
test cases to follow. Each of the next lines contain six integers XA, YA, XB, YB, XC , YC . This six
integers actually indicates that the Cartesian coordinates of point A, B and C are (XA, YA),(XB, YB)
and (XC , YC ) respectively. You can assume that the area of triangle ABC is not equal to zero, 0 ≤
XA, YA, XB, YB, XC , YC ≤ 1000 and the points A, B and C are in counter clockwise order.
Output
For each line of input you should produce one line of output. This line contains six floating point
numbers XD, YD, XE, YE, XF , YF separated by a single space. These six floating-point actually means
that the Cartesian coordinates of D, E and F are (XD, YD),(XE, YE) ,(XF , YF ) respectively. Errors
less than 10−5 will be accepted.
Sample Input
2
1 1 2 2 1 2
0 0 100 0 50 50
Sample Output
1.316987 1.816987 1.183013 1.683013 1.366025 1.633975
56.698730 25.000000 43.301270 25.000000 50.000000 13.397460
记录代码:
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#define siz 1000
using namespace std;
struct point{
double x,y;
point(double x,double y) :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 - (Vector A,Vector 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);}
double Dot(Vector A,Vector B) {return A.x*B.x+A.y*B.y;}
double Length (Vector A) {return sqrt(Dot(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;}
Vector Rotate(Vector A,double rad){
return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
}
point GetLine(point P,Vector v,point Q,Vector w){
Vector u=P-Q;
double t=Cross(w,u)/Cross(v,w);
return P+v*t;
}
int ax,ay,bx,by,cx,cy;
double dx,dy,ex,ey,fx,fy,ang_ABC,ang_BAC,ang_ACB;
point A(0,0),B(0,0),C(0,0),D(0,0),E(0,0),F(0,0);
Vector BD(0,0),BF(0,0),AE(0,0),AF(0,0),CE(0,0),CD(0,0);
int main()
{
int T;
cin>>T;
while(T--)
{
scanf("%d %d %d %d %d %d",&ax,&ay,&bx,&by,&cx,&cy);
A.x=ax,A.y=ay, B.x=bx,B.y=by, C.x=cx,C.y=cy;
ang_ABC=Angle(A-B,C-B);
ang_ACB=Angle(A-C,B-C);
ang_BAC=Angle(B-A,C-A);
//---D
BD=Rotate(C-B,ang_ABC/3);
CD=Rotate(B-C,-ang_ACB/3);
D=GetLine(C,CD,B,BD);
//--E
CE=Rotate(A-C,ang_ACB/3);
AE=Rotate(C-A,-ang_BAC/3);
E=GetLine(C,CE,A,AE);
//--F
BF=Rotate(A-B,-ang_ABC/3);
AF=Rotate(B-A,ang_BAC/3);
F=GetLine(B,BF,A,AF);
printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",D.x,D.y,E.x,E.y,F.x,F.y);
}
return 0;
}