• 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 }
    代码君
  • 相关阅读:
    更改数据库的主键长度
    数据库字段更改
    mysql数据权限的分配
    CentOS 7下安装Python3.6
    轻量级ORM框架:Dapper中的一些复杂操作和inner join应该注意的坑
    LINQ教程
    C# 委托及各种写法
    Func与Action
    C#中的is和as操作符
    Dapper ORM 用法
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/4022549.html
Copyright © 2020-2023  润新知