题意:给你三角形的三个点A,B,C,求他们角的三等分线相交组成的等边三角形的坐标。
题解:简单计算几何,用好旋转即可。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
#define pi acos(-1.0)
#define eps 1e-8
struct node{
double x,y;
};
node operator + (node a,node b){
node s;
s.x=a.x+b.x;
s.y=a.y+b.y;
return s;
}
node operator - (node a,node b){
node s;
s.x=a.x-b.x;
s.y=a.y-b.y;
return s;
}
node intersection(node u1,node u2,node v1,node v2){//求两直线交点 u1 u2代表直线1的两个点 v1 v2代表直线2的两个点
node ret=u1;
double t=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))
/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));
ret.x+=(u2.x-u1.x)*t;
ret.y+=(u2.y-u1.y)*t;
return ret;
}
node Rotate(node A,double rad){//逆时针旋转
return (node){A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad)};
}
int main(){
int t;
scanf("%d",&t);
while(t--){
node a,b,c;
scanf("%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y);
double A=acos((bb*bb+cc*cc-aa*aa)/2/bb/cc);//角A
double B=acos((aa*aa+cc*cc-bb*bb)/2/aa/cc);//角B
double C=acos((aa*aa+bb*bb-cc*cc)/2/aa/bb);//角C
node ab30=Rotate(b-a,A/3);//以a为定点 b为旋转点 逆时针旋转1/3角度后的向量
node ab303=a+ab30;//旋转后所在的点
node bc60=Rotate(c-b,B/3*2);//旋转2/3角度 下面都是同理
node bc606=b+bc60;
node f=intersection(a,ab303,b,bc606);//算出交点
node ab60=Rotate(b-a,A/3*2);
node ab606=a+ab60;
node ca30=Rotate(a-c,C/3);
node ca303=c+ca30;
node e=intersection(a,ab606,c,ca303);
node ca60=Rotate(a-c,C/3*2);
node ca606=c+ca60;
node bc30=Rotate(c-b,B/3);
node bc303=b+bc30;
node d=intersection(b,bc303,c,ca606);
printf("%.6f %.6f %.6f %.6f %.6f %.6f\n",d.x,d.y,e.x,e.y,f.x,f.y);
}
return 0;
}