[XJTUPC2024] 榕树之心
题目背景
你说的对,但是《榕树之心》是一款由 Corycle, HCCH, MCPlayer542, Veritas, wh 在游戏设计与开发课上研发的策略性多人对战游戏,游戏发生在一个热带雨林,在这里,你将扮演一棵榕树的「核心」,与其他榕树竞争养分和生存空间……
题目描述
游戏地图由若干正六边形构成,玩家可以控制榕树核心从一个六边形的中心移动的另一个相邻六边形的中心从而加固树枝、清理害虫、长出新枝条或者摧毁其他榕树。
平面的正六边形网格可以看做若干立方体堆叠出的立体图形的正等轴测图(如图),每个立方体的投影都是一个正六边形,于是立方体的空间坐标可以用来表示正六边形坐标。我们规定某一立方体中心位于原点,所有正方体中心坐标 ( x , y , z ) (x,y,z) (x,y,z) 都满足 x + y + z = 0 x+y+z=0 x+y+z=0,所以可以省略一维,用 ( x , y ) (x,y) (x,y) 来描述其对应正六边形的中心。这种坐标系统叫做纵向坐标。
游戏使用纵向坐标描绘六边形的位置,为了让玩家直观地看到核心的位置,Veritas 需要将其转化为平面直角坐标以便在屏幕上显示,请你帮助他将纵向坐标转换成平面直角坐标。
纵向坐标 ( x , y ) (x,y) (x,y) 到平面直角坐标 ( x ′ , y ′ ) (x^\prime,y^\prime) (x′,y′) 的转换公式为:
x ′ = 1 2 x + 1 2 y x^{\prime} = \frac{1}{2} x + \frac{1}{2} y x′=21x+21y
y ′ = 3 2 x − 3 2 y y^{\prime} = \frac{\sqrt{3}}{2} x - \frac{\sqrt{3}}{2} y y′=23x−23y
输入格式
仅一行,有两个用空格隔开的整数 x , y x,y x,y,表示纵向坐标 ( x , y ) (x,y) (x,y) ( − 1 0 6 ≤ x ≤ 1 0 6 , − 1 0 6 ≤ y ≤ 1 0 6 -10^6\le x\le 10^6,-10^6\le y\le 10^6 −106≤x≤106,−106≤y≤106)。
输出格式
一行两个实数 x ′ x^{\prime} x′ 和 y ′ y^{\prime} y′,用空格隔开,表示转换得到的平面直角坐标 ( x ′ , y ′ ) (x^\prime,y^\prime) (x′,y′)。
当你输出的两个实数与答案的相对误差或者绝对误差的较小者不超过 1 0 − 6 10^{-6} 10−6 时视为正确。
样例 #1
样例输入 #1
114 514
样例输出 #1
314.000000 -346.410162
样例 #2
样例输入 #2
0 0
样例输出 #2
0.000000 0.000000
样例 #3
样例输入 #3
1000000 -1000000
样例输出 #3
0.000000 1732050.807569
样例 #4
样例输入 #4
3 5
样例输出 #4
4.000000 -1.732051
样例 #5
样例输入 #5
-19 23
样例输出 #5
2.000000 -36.373067
提示说明
《榕树之心》游戏链接(线下参赛队伍赛时无法访问该链接):core-of-banyan.github.io。
欢迎大家(在赛后)游玩。
代码内容
// #include <iostream>
// #include <algorithm>
// #include <cstring>
// #include <stack>//栈
// #include <deque>//队列
// #include <queue>//堆/优先队列
// #include <map>//映射/* */
// #include <unordered_map>//哈希表
// #include <vector>//容器,存数组的数,表数组的长度
#include <bits/stdc++.h>
using namespace std;
int main()
{
double x,y;
cin>>x>>y;
printf("%.6lf\n",x/2+y/2);
printf("%.6lf\n",x/2*sqrt(3)-y/2*sqrt(3));
return 0;
}