编辑三角形 (30 分)

简介: 二维平面上有一个三角形,可以通过命令对其进行编辑。 其中命令 translate dx dy 是将三角形平移(dx,dy); 命令 rotate angle 是将三角形绕自己的中心位置(三个顶点的平均位置)旋转angle(角度制);

二维平面上有一个三角形,可以通过命令对其进行编辑。 其中命令 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;
} 
目录
相关文章
|
6月前
## 标题: 求一元二次方程的根(25分)
## 标题: 求一元二次方程的根(25分)
|
6月前
|
Serverless
统计问题|绘制任意分布的 QQ 图
统计问题|绘制任意分布的 QQ 图
134 1
|
6月前
|
机器学习/深度学习 算法 C++
【算法 | 实验6-1】n*n的网格,从左上角开始到右下角结束遍历所有的方块仅一次,总共有多少种不同的遍历路径
前言 思路介绍中省略了关于如何进行回溯搜索的细节,而主要讨论回溯中所使用的剪枝策略。
144 0
L2-023 图着色问题 (25 分)(图的遍历)
L2-023 图着色问题 (25 分)(图的遍历)
64 0
|
存储
L2-023 图着色问题 (25 分)
L2-023 图着色问题 (25 分)
117 0
L2-023 图着色问题 (25 分)
PTA 7-1 打印三角形拼图 (15 分)
一个正方形可以用两个等边直角三角形拼出来。给定正方形的边长、两个三角形和对角线所用的符号,请你打印出这两个三角形拼出的正方形。
131 0
【CCCC】L2-023 图着色问题 (25分),图的染色判定,遍历
【CCCC】L2-023 图着色问题 (25分),图的染色判定,遍历
179 0
L1-002 打印沙漏 (20 分)
L1-002 打印沙漏 (20 分)
151 0
7-42 行编辑器 (10 分)
7-42 行编辑器 (10 分)
169 0
ZCMU - 2065: 打印十字图
ZCMU - 2065: 打印十字图
90 0
ZCMU - 2065: 打印十字图