大意:做三角形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;
}