UVa 11178 (简单练习) Morley's Theorem
题意:
Morley定理:任意三角形中,每个角的三等分线,相交出来的三个点构成一个正三角形。
不过这和题目关系不大,题目所求是正三角形的三个点的坐标,保留6位小数。
分析:
由于对称性,求出D点,EF也是同样的。
用点和向量的形式表示一条直线,向量BA、BC的夹角为a1,则将BC逆时针旋转a1/3可求得 直线BD,同理也可求得直线CD,最后再求交点即可。
1 //#define LOCAL 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 8 struct Point 9 { 10 double x, y; 11 Point(double x=0, double y=0) :x(x),y(y) {} 12 }; 13 typedef Point Vector; 14 const double EPS = 1e-10; 15 16 Vector operator + (Vector A, Vector B) { return Vector(A.x + B.x, A.y + B.y); } 17 18 Vector operator - (Vector A, Vector B) { return Vector(A.x - B.x, A.y - B.y); } 19 20 Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p); } 21 22 Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p); } 23 24 bool operator < (const Point& a, const Point& b) 25 { return a.x < b.x || (a.x == b.x && a.y < b.y); } 26 27 int dcmp(double x) 28 { if(fabs(x) < EPS) return 0; else x < 0 ? -1 : 1; } 29 30 bool operator == (const Point& a, const Point& b) 31 { return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0; } 32 33 double Dot(Vector A, Vector B) 34 { return A.x*B.x + A.y*B.y; } 35 36 double Length(Vector A) { return sqrt(Dot(A, A)); } 37 38 double Angle(Vector A, Vector B) 39 { return acos(Dot(A, B) / Length(A) / Length(B)); } 40 41 double Cross(Vector A, Vector B) 42 { return A.x*B.y - A.y*B.x; } 43 44 double Area2(Point A, Point B, Point C) 45 { return Cross(B-A, C-A); } 46 47 Vector VRotate(Vector A, double rad) 48 { 49 return Vector(A.x*cos(rad) - A.y*sin(rad), A.x*sin(rad) + A.y*cos(rad)); 50 } 51 52 Point GetLineIntersection(Point P, Vector v, Point Q, Vector w) 53 { 54 Vector u = P - Q; 55 double t = Cross(w, u) / Cross(v, w); 56 return P + v*t; 57 } 58 59 Point read_point(void) 60 { 61 double x, y; 62 scanf("%lf%lf", &x, &y); 63 return Point(x, y); 64 } 65 66 Point GetD(Point A, Point B, Point C) 67 { 68 Vector v1 = C - B; 69 double a1 = Angle(A-B, v1); 70 v1 = VRotate(v1, a1/3); 71 72 Vector v2 = B - C; 73 double a2 = Angle(A-C, v2); 74 v2 = VRotate(v2, -a2/3); 75 76 return GetLineIntersection(B, v1, C, v2); 77 } 78 79 int main(void) 80 { 81 #ifdef LOCAL 82 freopen("11178in.txt", "r", stdin); 83 #endif 84 85 int T; 86 scanf("%d", &T); 87 while(T--) 88 { 89 Point A, B, C, D, E, F; 90 A = read_point(); 91 B = read_point(); 92 C = read_point(); 93 D = GetD(A, B, C); 94 E = GetD(B, C, A); 95 F = GetD(C, A, B); 96 printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", D.x, D.y, E.x, E.y, F.x, F.y); 97 } 98 99 return 0; 100 }