基于字符模式的图形生成与矩阵变换技术
动态绘制对称结构图形
给定整数 n,需输出一个上下对称、中心为 O 的菱形框架图案。上半部分由反斜杠、竖线和正斜杠构成,呈放射状向中心收敛;下半部分则为镜像扩展。核心在于控制每行前导空格数与符号间距。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 上半部分:从n行开始递减
for (int i = 0; i < n; ++i) {
// 前导空格
for (int s = 0; s < i; ++s) cout << ' ';
cout << '\\';
// 中间间隔空格
for (int s = 0; s < n - i - 1; ++s) cout << ' ';
cout << '|';
// 对称右侧空格
for (int s = 0; s < n - i - 1; ++s) cout << ' ';
cout << '/' << '\n';
}
// 中间横线连接O
for (int i = 0; i < n; ++i) cout << '-';
cout << 'O';
for (int i = 0; i < n; ++i) cout << '-';
cout << '\n';
// 下半部分:逐行展开
for (int i = 0; i < n; ++i) {
// 前导空格随行增加而减少
for (int s = 0; s < n - i - 1; ++s) cout << ' ';
cout << '/';
// 中间填充空格
for (int s = 0; s < i; ++s) cout << ' ';
cout << '|';
// 右侧对称空格
for (int s = 0; s < i; ++s) cout << ' ';
cout << '\\' << '\n';
}
return 0;
}
二维字符网格的几何变换操作
在处理字符画或点阵图时,常需实现旋转与翻转功能。以下函数基于零基索引设计,适用于 N×N 字符矩阵的原地变换。
顺时针旋转90度
通过坐标映射关系:原始位置 (i, j) 在旋转后位于新坐标 (j, N−1−i)。
void rotate90(vector<string>& grid) {
int size = grid.size();
vector<string> temp = grid;
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
temp[j][size - 1 - i] = grid[i][j];
grid = temp;
}
水平镜像翻转
将每一行的字符按中心轴左右互换,即 (i, j) 映射至 (i, N−1−j)。
void flipHorizontal(vector<string>& grid) {
int size = grid.size();
vector<string> mirror = grid;
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
mirror[i][j] = grid[i][size - 1 - j];
grid = mirror;
}
自定义字体字符串渲染系统
实现一个支持大写字母显示的ASCII艺术字引擎。每个字母以7行×5列的字符块存储,多个单词拼接时自动插入单空格分隔符。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 存储26个大写字母的7x5点阵表示
char font[26][7][6];
// 输出指定单词的点阵形式
void renderWord(const string& text) {
static bool firstLine = true;
if (text.empty()) return;
if (!firstLine) cout << '\n';
firstLine = false;
char output[7][100] = {0};
for (int pos = 0; pos < text.length(); ++pos) {
int letter = text[pos] - 'A';
for (int row = 0; row < 7; ++row)
for (int col = 0; col < 5; ++col)
output[row][pos * 6 + col] = font[letter][row][col];
}
// 插入字符间空隙
for (int i = 1; i < text.length(); ++i)
for (int row = 0; row < 7; ++row)
output[row][i * 6 - 1] = ' ';
for (int row = 0; row < 7; ++row)
cout << output[row] << '\n';
}
int main() {
// 加载所有字母模板
for (int c = 0; c < 26; ++c)
for (int r = 0; r < 7; ++r)
cin >> font[c][r];
string current;
char ch;
while ((ch = getchar()) != EOF) {
if (ch >= 'A' && ch <= 'Z') {
current += ch;
} else {
renderWord(current);
current.clear();
}
}
renderWord(current);
return 0;
}