zoukankan      html  css  js  c++  java
  • 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
    ", D.x, D.y, E.x, E.y, F.x, F.y);
     97     }
     98 
     99     return 0;
    100 }
    代码君
  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4022549.html
Copyright © 2011-2022 走看看