## **图像转ASCII小程序大作业**
# 一、实验内容
首先根据OJ给定的要求实现一个Array类,使该类具备有如下功能:①至少能初始化三个维度的数组,即该类至少需要支持三维索引;②具备基本的矩阵操作功能,至少拥有:矩阵加减法,矩阵点乘点除的操作;③支持reshape操作,即从一个一维矩阵reshape成二维或三维矩阵。;④支持获取C风格元数据操作,即从Array中获取一个指针,指针内的数据为你矩阵的元数据。
然后再在该Array类的基础上,藉由OJ给出的Z\_4\_Resources框架,实现一个能够读取图片像素信息,然后将像素内容转化成ASCII字符并以适当的大小显示在cmd窗口的小程序。
# **二、设计思路与功能描述**
## **2.1 项目思路说明**
### **2.1.1 Array类的实现**
Array类的成员属性基本和OJ提供的成员属性一致,但额外添加了capacity属性,用以存储原数组所占用的空间大小;添加了flag属性,用以存储当前对象在拷贝时是否需要新申请data空间。
其成员属性截图为:
![](https://www.writebug.com/myres/static/uploads/2021/10/28/3cccaf8010743fc6ad4042b9a9476716.writebug)
其中data指针用于指向当前对象所包含数据块的首位置,而index值则用于说明当前对象所指向的开始位置,通过两者的搭配使用可以实现对指定维度位数的索引。
shape数组则用于记录该无限维数组每一个维度的容量;axisNum用于记录原数组的维数;nowAxis用于记录当前索引位置的维数。axisNum与nowAxis是否相等是作为析构时是否释放data指针的唯一标准。
在完成对Array类基本属性的说明之后,以下将根据Array类四个功能要求的实现逐一说明Array类的工作原理。
1)支持多维度的索引。
在Array中,可使用的索引方式主要有\[\]的重载与at成员函数两种,这两种重载都要求能够实现对指定位置数据的增删改查。
为了实现对\[\]运算符的连续使用,这就要求\[\]运算符的返回类型依然是Array类,而由于在该过程中还同时能够对原数组的data内容进行修改,所以可知在生成Array返回对象的过程中,应该没有额外申请空间,不同对象的data指针指向的数据块也都是原数组的数据块。
与此同时,每当进行一次\[\]重载函数计算,就意味着该返回的Array类的当前维度(nowAxis)就会降低一个维度,与此同时,index值也要根据已经\[\]中的内容对指定维度容量大小的成绩进行增大,由此实现逐步"逼近"用户希望被索引的位置。
该过程的整体逻辑为:Array若目前已是0维,则无法索引,退出程序;若合理则从\[\]中取出要索引的下一个维度的值,将该值与目前除第一维度容量以外的维度容量相乘,从而得到当前索引指向的index值。之后定义一个返回的Array对象,其data指针与当前Array对象相符,但nowAxis减少了一维,index值进行了细致增加,shape值将当前Array的第一维刨除后进行了重新赋值。再将该对象作为计算结果返回,等待下一步索引或操作。
at成员函数的本质与\[\]重载相同,但at函数可以同时完成多个维度的索引查找,所以只需要根据at传入参数的个数套上for循环即可。
值得一提的是,由于该过程中生成的Array本质都是在索引计算中的"附带产物",其data指针所指的数据块都是原始数组的数据块,所以在这些"附带产物"析构的过程,不应该对data空间进行释放------这一过程只需要判断nowAxis与axisNum值是否一样即可。
2)支持矩阵点运算
本功能的实现其实只是单纯的加减符号的多态重载,并不具有很大的难度,但如何让计算结果能够顺利返回到主函数而不在中途被析构掉,才是本题最大的难点所在。
对题目要求进行分析,可知当两个Array进行运算时,产生结果的过程不应该影响到这两个Array的任何属性,所以这就要求运算符重载时返回的新产生对象的data指针不应该和两个Array类公用数据块,而应当是重新申请一个大小为capacity的空间用以存放计算结果。
但新产生的对象本质是重载函数中的局部变量,在返回时势必要调用析构函数,但因为该新对象没有进行索引,nowAxis与axisNum的值一样,所以data中存放的计算结果会被释放掉,导致结果无法传递回主函数。
这是因为重载函数在return时要先调用一次拷贝构造函数,将要return的对象拷贝到一个临时对象中,再藉由该对象作为消息与主函数通信。而在一般情况下,拷贝构造函数就是简单的对要return对象中的内容进行赋值,data指针也会被随之复制过去,这时候data指针与类中定义的局部对象的data指针公用数据块,所以在重载函数结束,析构局部对象时,该数据块被释放,临时对象的data指针也变成了野指针。
为此,只需要在明确后续主函数还需要使用data内容的前提下,将flag值赋为false,然后在拷贝构造函数中,将flag值为false的对象的data新申请一个大小为capacity的空间,然后将原data中的值一一复制过来即可。由此可实现分离两个对象data指针所指数据块的目的。
3)支持reshape操作
由于Array中存储的数据本质上都是一维的,所以所谓的索引、维度都是再以不同的视角来实现对data所指数据块内容的查看。所以只需要将新定义的维度复制到Array中,然后再对axisNum与nowAxis的值加以修改即可。
而在进行索引调用时,假设原数组的容量为\[x~1~\],\[x~2~\],\...,\[x~n~\],当用户调用的索引为\[a~1~\],\[a~2~\],\...\[a~m~\](m≤n)时,可得其index的计算式为:
![](https://www.writebug.com/myres/static/uploads/2021/10/28/97bffb43534b0350f1227aceda86bae3.writebug)
而所谓的reshape,其本质就是对x~k~的值进行了修改。
4)C风格元素操作
由于Array中的数据都是以线性存储在一个数据块中的,如果用户想通过指针实现类似于C风格的操作时,只需要对data指针返回以供操作即可。
### **2.1.2 字符画的实现**
字符画绘制的具体流程图为:
![](https://www.writebug.com/myres/static/uploads/2021/10/28/2242f9994b396176a99095f39e22c70a.writebug)
通过流程图不难看出,字符画的绘制本质上就是将要绘制的图片像素进行识别,然后将其转化为对应的字符,具体可分为如下几个步骤:
1)绘制图片的读入
该部分功能已由框架给出,主要是通过winAPI的相关函数,将对应图片的像素信息以R G B A R G B A\...的方式存入data\[\]数组中。
2)data内容转移至sp
为了便于后续操作,这里需要将data中的内容存放入Array对象中,首先定义一个对象sp,其规格为图片长×宽×4(四通道),该对象主要用于将本属于一个图片位置的四个通道数据进行整合,便于后续操作。
3)灰度转换
由于最终的字符画是按照灰度信息进行转换的,所以在这里需要对图片的灰度信息进行计算,具体的计算公式为:
![](https://www.writebug.com/myres/static/uploads/2021/10/28/0694ae682a6d2162100e97ee4483fd77.writebug)
同时,在这一过程中考虑到cmd窗口输出的字符高度为宽度的两倍,所以为了使最终绘制结果不会被"压扁",所以在这里采用同时读取上下两个相邻位置的灰度值求平均的方式来作为对应位置的灰度值。
4)times倍数压缩
由于受到屏幕大小的限制,在不调整控制台字符大小的前提下,无法完整显示图片,而由于本人使用的为win8系统,无法在C++程序中完成对控制台字符大小的控制
没有合适的资源?快使用搜索试试~ 我知道了~
基于算法和C语言实现的字符画程序【100012991】
共44个文件
tlog:13个
jpg:10个
pdb:2个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 162 浏览量
2023-07-18
14:27:23
上传
评论
收藏 23.88MB ZIP 举报
温馨提示
首先根据OJ给定的要求实现一个Array类,使该类具备有如下功能:①至少能初始化三个维度的数组,即该类至少需要支持三维索引;②具备基本的矩阵操作功能,至少拥有:矩阵加减法,矩阵点乘点除的操作;③支持reshape操作,即从一个一维矩阵reshape成二维或三维矩阵。;④支持获取C风格元数据操作,即从Array中获取一个指针,指针内的数据为你矩阵的元数据。 然后再在该Array类的基础上,藉由OJ给出的Z_4_Resources框架,实现一个能够读取图片像素信息,然后将像素内容转化成ASCII字符并以适当的大小显示在cmd窗口的小程序。
资源推荐
资源详情
资源评论
收起资源包目录
100012991-基于算法和C语言实现的字符画程序.zip (44个子文件)
zifumaster
LICENSE 11KB
.gitignore 270B
字符画
1950000_ZongHe4
Z_4_Resources.sln 1KB
Z_4_Resources
video.rar 13.71MB
Z_4_Resources.vcxproj 7KB
x64
Release
vc141.pdb 444KB
Z_4_Resources.log 2KB
Z_4_Resources.tlog
CL.write.1.tlog 552B
Z_4_Resources.lastbuildstate 264B
CL.command.1.tlog 788B
Z_4_Resources.write.1u.tlog 560B
link.command.1.tlog 1KB
link.read.1.tlog 4KB
link.write.1.tlog 554B
CL.read.1.tlog 41KB
Debug
vc141.pdb 452KB
vc141.idb 347KB
Z_4_Resources.log 2KB
Z_4_Resources.tlog
CL.write.1.tlog 732B
Z_4_Resources.lastbuildstate 262B
CL.command.1.tlog 780B
link.command.1.tlog 1KB
link.read.1.tlog 4KB
link.write.1.tlog 718B
CL.read.1.tlog 41KB
Z_4_Resources.vcxproj.filters 1KB
Z_4_Resources.vcxproj.user 165B
PicReader.h 14KB
demo.cpp 5KB
classic_picture
cameraman.jpg 15KB
airplane.jpg 38KB
lena.jpg 629KB
baboon.jpg 79KB
peppers.jpg 41KB
milkdrop.jpg 29KB
compa.png 34KB
goldhill.jpg 62KB
lena1.jpg 2KB
woman.jpg 44KB
barbara.jpg 73KB
FastPrinter.h 10KB
sound
sea.wav 6.8MB
高程大作业.docx 2.81MB
README.md 20KB
共 44 条
- 1
资源评论
神仙别闹
- 粉丝: 2667
- 资源: 7640
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功