二维平面上有一个三角形,可以通过命令对其进行编辑。 其中命令 translate dx dy 是将三角形平移(dx,dy); 命令 rotate angle 是将三角形绕自己的中心位置(三个顶点的平均位置)旋转angle(角度制); 命令 scale ratio 是将三角形相对于自己的中心位置缩放ratio(例如1.0表示不缩放,2.0表示放大一倍,0.5表示缩小一倍); 命令 undo 是撤销刚才的一个编辑操作。
输入格式:
第一行给出六个实数x0 y0 x1 y1 x2 y2 表示该三角形的三个顶点坐标。第二行给出正整数n (1=< n <=100),表示命令个数,随后n行给出具体的编辑命令。
输出格式:
输出被编辑后的三角形的三个顶点坐标。每个数之间用一个空格分割,最后一个数后面不要多加空格。所有实数保留3位小数。
样例:
例如输入1:
3.0 3.0 4.0 3.0 3.0 4.0
1
translate 1.5 -1.5
输出:
4.500 1.500 5.500 1.500 4.500 2.500
例如输入2:
3.0 3.0 4.0 3.0 3.0 4.0
1
rotate 90.0
输出:
3.667 3.000 3.667 4.000 2.667 3.000
例如输入3:
3.0 3.0 4.0 3.0 3.0 4.0
1
scale 0.5
输出:
3.167 3.167 3.667 3.167 3.167 3.667
例如输入4:
3.0 3.0 4.0 3.0 3.0 4.0
4
scale 0.5
undo
rotate 90.0
translate 0.5 0.6
输出:
4.167 3.600 4.167 4.600 3.167 3.600
#include<bits/stdc++.h>
#include<cstdlib>
#include<iostream>
#include<string>
#include<map>
#include<cmath>
#define pi 3.141592653589793238462643383279502884197169399375105820974944592307816406286
using namespace std;
double x0,y0_,x1,y1_,x2,y2;
double ax,ay,bx,by,cx,cy;//记录修改前的坐标
void translate(double dx,double dy)
{
x0+=dx;
x1+=dx;
x2+=dx;
y0_+=dy;
y1_+=dy;
y2+=dy;
}
void rotate(double angle)//旋转角度我用的向量,可以搜搜向量旋转计算
{
double x,y,x_,y_;
x_=(x0+x1+x2)/3.0;//中心位置
y_=(y0_+y1_+y2)/3.0;
x=x0-x_;
y=y0_-y_;
x0=x*cos(angle)-y*sin(angle)+x_;
y0_=y*cos(angle)+x*sin(angle)+y_;
x=x1-x_;
y=y1_-y_;
x1=x*cos(angle)-y*sin(angle)+x_;
y1_=y*cos(angle)+x*sin(angle)+y_;
x=x2-x_;
y=y2-y_;
x2=x*cos(angle)-y*sin(angle)+x_;
y2=y*cos(angle)+x*sin(angle)+y_;
}
void scale(double ratio)//这里同样我用的向量的知识
{
double x,y,m,n;
x=(x0+x1+x2)/3.0;//中心位置
y=(y0_+y1_+y2)/3.0;
m=x0-x;
n=y0_-y;
x0=ratio*m+x;
y0_=ratio*n+y;
m=x1-x;
n=y1_-y;
x1=ratio*m+x;
y1_=ratio*n+y;
m=x2-x;
n=y2-y;
x2=ratio*m+x;
y2=ratio*n+y;
}
void last()//记录上一次的坐标
{
ax=x0,ay=y0_;
bx=x1,by=y1_;
cx=x2,cy=y2;
}
int main()
{
int n;
cin>>x0>>y0_>>x1>>y1_>>x2>>y2;
cin>>n;
while(n--)
{
string str;
cin>>str;
if(str=="translate")
{
double dx,dy;
cin>>dx>>dy;
last();
translate(dx,dy);
}
if(str=="rotate")
{
double angle;
cin>>angle;
angle*=pi/180.0;
last();
rotate(angle);
}
if(str=="scale")
{
double ratio;
cin>>ratio;
last();
scale(ratio);
}
if(str=="undo")//把本次的坐标等于上一次的坐标
{
x0=ax,y0_=ay;
x1=bx,y1_=by;
x2=cx,y2=cy;
}
}
printf("%.3f %.3f %.3f %.3f %.3f %.3f",x0,y0_,x1,y1_,x2,y2);
return 0;
}