编辑三角形 (30 分)

编辑三角形 (30 分),第1张

编辑三角形 (30 分)

二维平面上有一个三角形,可以通过命令对其进行编辑。 其中命令 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
#include
#include
#include
#include
#include
#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;
} 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5710441.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存