2022icpc山东省赛 J.Football Match(计算几何)

题目链接

题意

     给定 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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值