最新消息:

图像的翻转旋转

C++ 少儿编程 2288浏览 0评论

图像的翻转旋转

【问题描述】给定m行n列的图像各像素点灰度值,对其依次进行一系列操作后,求最终图像。

其中,可能的操作及对应字符有如下四种:

A:顺时针旋转90度;

B:逆时针旋转90度;

C:左右翻转;

D:上下翻转。

【输入】

第一行包含两个正整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。
接下来m行,每行n个整数,表示图像中每个像素点的灰度值,相邻两个数之间用单个空格隔开。灰度值范围在0到255之间。
接下来一行,包含由A、B、C、D组成的字符串s,表示需要按顺序执行的操作序列。s的长度在1到100之间。

【输出】

m’行,每行包含n’个整数,为最终图像各像素点的灰度值。其中m’为最终图像的行数,n’为最终图像的列数。相邻两个整数之间用单个空格隔开。

样例输入

2 3
10 0 10
100 100 10
AC

样例输出

10 100
0 100
10 10

问题解析:

1)       例如原始数组为a数组,变换后存入b数组当中,分析每种变换之后的坐标有什么特点以及行和列有什么变化:

顺时针翻转:b[j][m-1-i]= a[i][j];   b数组的行数是a数组的列数,b数组的列数是a数组的行数;

逆时针翻转:b[n-1-j][i]= a[i][j];  b数组的行数是a数组的列数,b数组的列数是a数组的行数;

左右翻转:b[i][n-1-j]= a[i][j];   行和列均不变;

上下翻转:b[m-1-i][j]= a[i][j];  行和列均不变;

使用自定义函数单独处理四种翻转变换;

2)       输入一个二维数组a,输入一个字符串s,遍历字符串,判断每个字符,如果是A,则调用顺时针翻转函数,如果是B,则调用逆时针翻转函数,如果是C,则调用左右翻转函数,如果是D,则调用上下翻转函数;

3)       最后将变换后的图形输出。


完整代码参考:

#include <iostream>

#include <string>

using namespace std;

int a[100][100]={};

int b[100][100]={};

int m,n;

//定义复制数组函数

void copyab(){

        for(int i = 0; i < m; i++) {

               for(int j = 0;j < n;j++){

                       a[i][j] = b[i][j];

               }

        }

}

//定义顺时针翻转函数

void clockwise() {

        for(int i = 0; i < m; i++) {

               for(int j = 0;j < n;j++){

                       b[j][m-1-i]=a[i][j];

               }

        }

        int t = m;

        m = n;

        n = t;

        copyab();

}

//定义逆时针翻转函数

void anticlockwise() {

        for(int i = 0; i < m; i++) {

               for(int j= 0; j <n; j++) {

                       b[n-1-j][i]=a[i][j];

               }

        }

        int t = m;

        m = n;

        n = t;

        copyab();

}

//定义左右翻转函数

void flip() {

        for(int i = 0; i < m; i++) {

               for(int j = 0; j < n; j++) {

                       b[i][n-1-j]=a[i][j];

               }

        }

        copyab();

}

//定义上下翻转函数

void upside_down() {

        for(int i = 0; i < m; i++) {

               for(int j = 0; j < n; j++) {

                       b[m-1-i][j]=a[i][j];

               }

        }

        copyab();

}

 

int main() {

        //1.输入二维数组

        cin >>m >>n;

        for(int i = 0; i < m; i++) {

               for(int j = 0; j < n; j++) {

                       cin >>a[i][j];

               }

        }

        //2.输入字符串并判断每个字符调用对应的函数

        string s;

        cin>>s;

        for(int i = 0;i < s.length();i++){

               if(s[i] == ‘A’){

                       clockwise();

               }else if(s[i] == ‘B’){

                       anticlockwise();

               }else if(s[i] == ‘C’){

                       flip();

               }else if(s[i] == ‘D’){

                       upside_down();

               }

        }

        //3.输出变换后的二维数组

        for(int i = 0; i < m; i++) {

               for(int j = 0; j < n; j++) {

                       cout << a[i][j] << ” “;

               }

               cout << endl;

        }

        return 0;

}

 

转自公众号:
noip案例讲解

您必须 登录 才能发表评论!