UVA 11178 Morley's Theorem

来源:互联网 发布:solus linux安装 编辑:程序博客网 时间:2024/05/21 21:45

大意:做三角形ABC每个内角额三等分线,相交成三角形DEF,则三角形DEF是等边三角形。你的任务是根据A、B、C三个点的位置确定D、E、F的位置。

思路:求出<ABC的大小a1,然后将向量BC旋转a1/3,求出<ACB的大小a1,然后将向量CB旋转a2/3,然后求两线段的交点D即可,E、F同理。

#include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <stack>using namespace std;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){if(a.x != b.x) return a.x < b.x;return a.y < b.y;}const double eps = 1e-10;int dcmp(double x){if(fabs(x) < eps) return 0; return x < 0 ? -1 : 1;}bool operator == (const Point &a, const Point &b){return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;}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; }double Area2(Point A, Point B, Point C) { return Cross(B-A, C-A); }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 GetIntersection(Point P, Vector v, Point Q, Vector w){Vector u = P-Q;double t = Cross(w, u) / Cross(v, w);return P+v*t;}Point A, B, C, D, E, F;Point read_point(){Point A;scanf("%lf%lf", &A.x, &A.y);return A;}Point getD(Point A, Point B, Point C){Vector v1 = C-B, v2 = A-B;double a1 = Angle(v1, v2);v1 = Rotate(v1, a1/3);Vector v3 = B-C, v4 = A-C;double a2 = Angle(v3, v4);v3 = Rotate(v3, -a2/3);return GetIntersection(B, v1, C, v3);}void solve(){A = read_point();B = read_point();C = read_point();D = getD(A, B, C);E = getD(B, C, A);F = getD(C, A, B);printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n", D.x, D.y, E.x, E.y, F.x, F.y);}int main(){int T;scanf("%d", &T);while(T--){solve();}return 0;}