📜  c++ print 3d cube - C++ (1)

📅  最后修改于: 2023-12-03 15:29:49.752000             🧑  作者: Mango

C++ 打印 3D 立方体

本篇文章将介绍如何使用 C++ 在控制台中打印出 3D 立方体。立方体是一种常见的几何图形,而 3D 立方体则更具有立体感。在编写程序时,需要掌握一些基本的图形学知识。

绘制 3D 立方体

在绘制 3D 立方体之前,需要定义一些参数。假设我们的控制台大小为 80x25,那么可以定义以下参数:

const int width = 80;
const int height = 25;
const int depth = 25;

接下来,我们需要定义一个 3D 数组,用于存储立方体的状态:

bool cube[depth][height][width];

在开始绘制 3D 立方体之前,我们需要清空数组中的数据,以便于开始绘制:

memset(cube, false, sizeof(cube));

接下来,我们可以开始绘制立方体了。首先,我们需要绘制立方体的边框。可以使用双重循环来实现:

for (int z = 0; z < depth; z++) {
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            if (z == 0 || z == depth - 1 ||
                y == 0 || y == height - 1 ||
                x == 0 || x == width - 1) {
                cube[z][y][x] = true;
            }
        }
    }
}

这段代码会遍历整个数组,如果当前点在立方体的边界上,则将对应的数组元素设为真。这样,我们就得到了一个空心的立方体。

接下来,我们需要将立方体填充起来。可以使用类似于“洪泛填充”的算法来实现:

// 定义一个结构体,用于保存点的坐标
struct Point {
    int x, y, z;
};

// 定义一个队列,用于存放待填充的点
std::queue<Point> q;

// 随机选择立方体内部的一个点作为填充点
int start_x = 5;
int start_y = 5;
int start_z = 5;
q.push({ start_x, start_y, start_z });
cube[start_z][start_y][start_x] = true;

// 开始填充
while (!q.empty()) {
    auto p = q.front();
    q.pop();

    // 向六个方向扩展
    for (auto [dx, dy, dz] : {{1, 0, 0}, {-1, 0, 0},
                              {0, 1, 0}, {0, -1, 0},
                              {0, 0, 1}, {0, 0, -1}}) {
        int nx = p.x + dx;
        int ny = p.y + dy;
        int nz = p.z + dz;
        if (nx < 0 || nx >= width ||
            ny < 0 || ny >= height ||
            nz < 0 || nz >= depth) {
            continue;
        }
        if (!cube[nz][ny][nx]) {
            cube[nz][ny][nx] = true;
            q.push({ nx, ny, nz });
        }
    }
}

这段代码会随机选择立方体内部的一个点作为填充点,并使用队列来存放待填充的点。每次从队列中取出一个点后,会向六个方向扩展,并将扩展出的点加入队列中,最终完成填充。

填充完成后,我们就得到了一个完整的 3D 立方体。接下来,我们需要将其输出到控制台中。可以使用以下代码来实现:

for (int z = 0; z < depth; z++) {
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            if (cube[z][y][x]) {
                std::cout << "#";
            } else {
                std::cout << " ";
            }
        }
        std::cout << std::endl;
    }
    // 每层之间留空一行
    std::cout << std::endl;
}
完整代码
#include <iostream>
#include <cstring>
#include <queue>

const int width = 80;
const int height = 25;
const int depth = 25;

bool cube[depth][height][width];

int main() {
    // 清空状态数组
    memset(cube, false, sizeof(cube));

    // 绘制边框
    for (int z = 0; z < depth; z++) {
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (z == 0 || z == depth - 1 ||
                    y == 0 || y == height - 1 ||
                    x == 0 || x == width - 1) {
                    cube[z][y][x] = true;
                }
            }
        }
    }

    // 填充内部
    struct Point {
        int x, y, z;
    };
    std::queue<Point> q;
    int start_x = 5;
    int start_y = 5;
    int start_z = 5;
    q.push({ start_x, start_y, start_z });
    cube[start_z][start_y][start_x] = true;

    while (!q.empty()) {
        auto p = q.front();
        q.pop();

        for (auto [dx, dy, dz] : {{1, 0, 0}, {-1, 0, 0},
                                  {0, 1, 0}, {0, -1, 0},
                                  {0, 0, 1}, {0, 0, -1}}) {
            int nx = p.x + dx;
            int ny = p.y + dy;
            int nz = p.z + dz;
            if (nx < 0 || nx >= width ||
                ny < 0 || ny >= height ||
                nz < 0 || nz >= depth) {
                continue;
            }
            if (!cube[nz][ny][nx]) {
                cube[nz][ny][nx] = true;
                q.push({ nx, ny, nz });
            }
        }
    }

    // 绘制 3D 立方体
    for (int z = 0; z < depth; z++) {
        for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                if (cube[z][y][x]) {
                    std::cout << "#";
                } else {
                    std::cout << " ";
                }
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }

    return 0;
}

以上是使用 C++ 在控制台中打印 3D 立方体的全部过程及代码。