题意: 给你三角形三个点, 定理是 三个内角的三等分线相交得出 DEF三点,
三角新 DFE是等边三角形
然后要你输出 D E F 的坐标
思路 :
求出三个内角,对于D 相当于 BC向量逆时针旋转, CB向量顺时针旋转 ,相交得到的点;
同理可以求出其他点 (LRJ 模板真强大)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const double eps = 1e-11; struct Point { double x, y; Point(double x = 0, double y = 0) : x(x), y(y) {} }; typedef Point Vector; int dcmp(double x) { if(fabs(x) < eps) return 0 ; else return x < 0 ? -1 : 1; } 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) { 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; } ///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)) ; } Vector Normal (Vector A) { double L = Length(A); return Vector(-A.y/L, A.x/L); } ///单位向量 Point GetLineIntersection (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 GetPoint (Point A, Point B, Point C) { Vector v = C-B; double rad = Angle(A-B,v); v = Rotate(v, rad/3); Vector vv = B-C; rad = Angle(A-C,vv); vv = Rotate(vv, -rad/3); return GetLineIntersection(B,v, C,vv); } int main() { int t; scanf("%d",&t); while(t--) { Point A, B, C, D, E, F; cin >> A.x >> A.y >> B.x >>B.y >> C.x >>C.y; D = GetPoint(A,B,C); E = GetPoint(B,C,A); F = GetPoint(C,A,B); printf("%.6lf %.6lf %.6lf %.6lf %.6lf %.6lf\n",D.x,D.y,E.x,E.y,F.x,F.y); } return 0; }