C++ 实现控制台3D动画

 由于代码竞赛活动要求代码行数尽可能少,所以代码没有任何模块性或者可阅读性。但是,在Linux上编译完成后(注意要包含curses库,即g++编译时加上`-l curses`选项),就可以看到一个不断旋转浮动的彩色立方体。

#include <curses.h>
#include <vector>
#include <ctime>
#include <cmath>
using namespace std;
vector<double> p1{ -1, -1, -1 }, p2{ 1, -1, -1 }, p3{ 1, -1, 1 }, p4{ -1, -1, 1 }, p5{ -1, 1, -1 }, p6{ 1, 1, -1 }, p7{ 1, 1, 1 }, p8{ -1, 1, 1 }, da{ 0.05, -0.02, 0 };
char canvas[100][200]; double depths[100][200]; int ox, oy, sx, sy;
void render(vector<double>& p1, vector<double>& p2, vector<double>& p3, char ch)
{
    auto map = [&](vector<double>& p) ->vector<int> { return { ox + (int)(p[0] * sx), oy - (int)(p[1] * sy) }; };
    double dep = p2[2] + p3[2];
    vector<int> O = map(p1), A = map(p2), B = map(p3);
    if (O[1] > A[1]) swap(O, A); if (O[1] > B[1]) swap(O, B); if (A[1] > B[1]) swap(A, B);
    double k12 = ((double)A[0] - O[0]) / (A[1] - O[1]), k13 = ((double)B[0] - O[0]) / (B[1] - O[1]), k23 = ((double)B[0] - A[0]) / (B[1] - A[1]);
    for (int i = O[1]; i <= A[1]; ++i) {
        double ta = O[0] + k12 * (i - O[1]), tb = O[0] + k13 * (i - O[1]); int ja = ((ta != ta) ? A[0] : ta), jb = ((tb != tb) ? O[0] : tb);
        for (int j = min(ja, jb); j <= max(ja, jb); ++j) if (i >= 0 && i < 100 && j >= 0 && j < 200 && dep < depths[i][j])
            canvas[i][j] = ch, depths[i][j] = dep;
    }
    for (int i = A[1]; i <= B[1]; ++i) {
        double ta = B[0] - k13 * (B[1] - i), tb = B[0] - k23 * (B[1] - i); int ja = ((ta != ta) ? B[0] : ta), jb = ((tb != tb) ? A[0] : tb);
        for (int j = min(ja, jb); j <= max(ja, jb); ++j) if (i >= 0 && i < 100 && j >= 0 && j < 200 && dep < depths[i][j])
            canvas[i][j] = ch, depths[i][j] = dep;
    }
}
int main()
{
    initscr(), noecho(), curs_set(FALSE), oy = LINES / 2, ox = COLS / 2, sy = LINES / 4, sx = sy * 2;
    start_color(); init_pair(1, COLOR_GREEN, COLOR_BLACK); init_pair(2, COLOR_CYAN, COLOR_BLACK); init_pair(3, COLOR_YELLOW, COLOR_BLACK); init_pair(4, COLOR_MAGENTA, COLOR_BLACK); init_pair(5, COLOR_BLUE, COLOR_BLACK); init_pair(6, COLOR_WHITE, COLOR_BLACK);
    auto rotate = [&](vector<double>& p) {p = { (p[0]) * cos(da[1]) + (p[1] * sin(da[0]) + p[2] * cos(da[0])) * sin(da[1]), p[1] * cos(da[0]) - p[2] * sin(da[0]), -(p[0]) * sin(da[1]) + (p[1] * sin(da[0]) + p[2] * cos(da[0])) * cos(da[1]) };};
    clock_t t0 = clock(), t1 = t0, dt = CLOCKS_PER_SEC / 16;
    while (true) if (((t1 = clock()) - t0 > dt) && (t0 = t1)) {
        for (int i = 0; i < 100; ++i) for (int j = 0; j < 200; ++j) canvas[i][j] = ' ', depths[i][j] = INFINITY;
        render(p1, p2, p4, 'A'), render(p3, p2, p4, 'A'), render(p1, p2, p5, 'B'), render(p6, p5, p2, 'B'), render(p1, p4, p5, 'C'), render(p8, p4, p5, 'C'), render(p7, p3, p6, 'D'), render(p2, p3, p6, 'D'), render(p7, p6, p8, 'E'), render(p5, p6, p8, 'E'), render(p7, p3, p8, 'F'), render(p4, p3, p8, 'F');
        for (int i = 0; i < LINES; ++i) for (int j = 0; j < COLS; ++j) { attron(COLOR_PAIR(canvas[i][j] - 'A' + 1));mvaddch(i, j, canvas[i][j]);attroff(COLOR_PAIR(canvas[i][j] - 'A' + 1)); }
        refresh(), rotate(p1), rotate(p2), rotate(p3), rotate(p4), rotate(p5), rotate(p6), rotate(p7), rotate(p8);
        oy = LINES / 2 + 5 * sin(t1 * 0.000002), ox = COLS / 2 + 20 * cos(t1 * 0.000001), sy = LINES / 4, sx = 2 * sy, da[1] = 0.2 * sin(t1 * 0.000001);
    }
}

3D控制台动画

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值