题意
给定 A , B 的坐标,求出其他点的坐标,图像可以缩放,旋转。
思路
按照图中的形式求出所有点坐标,然后旋转即可。。。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double pi=acos(-1.0);
struct node{
double x,y;
node(double a,double b):x(a),y(b){}
node(){}
};
node change(node a,node b,double jiao){
double dis=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
double jj;
if(abs(a.x-b.x)<=1e-6) jj=pi/2;
else jj=atan((a.y-b.y)/(a.x-b.x));
if(b.x<a.x||(abs(a.x-b.x)<=1e-6&&b.y<a.y)) jj+=pi;
jj+=jiao;
node ans;
ans.x=a.x+cos(jj)*dis;
ans.y=a.y+sin(jj)*dis;
return ans;
}
void solve(){
node a,b;
cin>>a.x>>a.y>>b.x>>b.y;
double dis=sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
node bb;
bb.x=a.x;
bb.y=a.y+dis;
node c,d;
c.x=bb.x+dis/2*3;
c.y=bb.y;
d.x=a.x+dis/2*3;
d.y=a.y;
node cen=node((a.x+c.x)/2,(a.y+c.y)/2);
double bj1=dis/20*6;
double bj2=bj1*sin(pi*18/180)/sin(pi*126/180);
node e[6];
double jiao=pi/2;
for(int i=1;i<=5;i++){
e[i].x=cen.x+cos(jiao)*bj1;
e[i].y=cen.y+sin(jiao)*bj1;
jiao-=pi*72/180;
}
node j[6];
jiao=pi*3/2;
for(int i=1;i<=5;i++){
j[i].x=cen.x+cos(jiao)*bj2;
j[i].y=cen.y+sin(jiao)*bj2;
jiao-=pi*72/180;
}
if(abs(a.x-b.x)>1e-6) jiao=atan((a.y-b.y)/(a.x-b.x));
else jiao=pi/2;
if(b.x<a.x||(abs(a.x-b.x)<=1e-6&&b.y<a.y)) jiao+=pi;
jiao-=pi/2;
c=change(a,c,jiao);
d=change(a,d,jiao);
for(int i=1;i<=5;i++){
e[i]=change(a,e[i],jiao);
j[i]=change(a,j[i],jiao);
}
printf("%.8f %.8f ",c.x,c.y);
printf("%.8f %.8f ",d.x,d.y);
printf("%.8f %.8f ",e[1].x,e[1].y);
printf("%.8f %.8f ",j[4].x,j[4].y);
printf("%.8f %.8f ",e[2].x,e[2].y);
printf("%.8f %.8f ",j[5].x,j[5].y);
printf("%.8f %.8f ",e[3].x,e[3].y);
printf("%.8f %.8f ",j[1].x,j[1].y);
printf("%.8f %.8f ",e[4].x,e[4].y);
printf("%.8f %.8f ",j[2].x,j[2].y);
printf("%.8f %.8f ",e[5].x,e[5].y);
printf("%.8f %.8f\n",j[3].x,j[3].y);
}
int main()
{
int _;
cin>>_;
while(_--) solve();
return 0;
}