Comucopia丰饶角曲面3D旋转动画解析_C++精灵库可视化案例

C++丰饶角曲面3D旋转动画.这是一个展示数学公式如何通过编程变成绚丽3D动画的视频。

C++丰饶角曲面3D旋转动画_C++精灵库可视化应用

它的所有代码如下所示:

cpp 复制代码
#include "sprites.h"  //包含C++精灵库
#include <cmath>      // 数学库
#include <vector>     // 存储顶点坐标

Screen screen;   //新建屏幕对象
Sprite pen{"blank"};    //新建无造型角色,作为画笔

const double PI = M_PI;    // 定义常量
// 三个轴的旋转角度(分别控制X/Y/Z轴旋转)
double rotate_angle_x=0.0;
double rotate_angle_y=0.0;
double rotate_angle_z=0.0;  

// 定义Comucopia曲面的核心参数(完全按你的要求配置)
const double a = 0.05;          // 公式参数a
const double b = 0.1;          // 补充参数b(默认0.1,可自定义调整)
const double X_SCALE = 1.0;    // X轴缩放
const double Y_SCALE = 1.0;    // Y轴缩放
const double Z_SCALE = 1.0;    // Z轴缩放
const double X_OFFSET = 0.0;    // X轴偏移
const double Y_OFFSET = 0.0;    // Y轴偏移
const double Z_OFFSET = 0.0;    // Z轴偏移

struct Point3D { double x, y, z;};  // 3D点结构体

// 3D点绕X轴旋转
Point3D rotateX(Point3D p, double angle) {
    double cos_a = cos(angle);
    double sin_a = sin(angle);
    return {
        p.x,
        p.y * cos_a - p.z * sin_a,
        p.y * sin_a + p.z * cos_a
    };
}

// 3D点绕Y轴旋转
Point3D rotateY(Point3D p, double angle) {
    double cos_a = cos(angle);
    double sin_a = sin(angle);
    return {
        p.x * cos_a + p.z * sin_a,  // 修正原代码投影方向错误,保证旋转方向正确
        p.y,
        -p.x * sin_a + p.z * cos_a
    };
}

// 3D点绕Z轴旋转
Point3D rotateZ(Point3D p, double angle) {
    double cos_a = cos(angle);
    double sin_a = sin(angle);
    return {
        p.x * cos_a - p.y * sin_a,
        p.x * sin_a + p.y * cos_a,
        p.z
    };
}

// 透视投影:3D转2D(优化版,适配Comucopia曲面的深度)
void project(Point3D p, int& screen_x, int& screen_y, double scale = 150.0) {
    double factor = scale / (3.0 + p.z);  // 调整透视因子,适配曲面范围
    screen_x = static_cast<int>(p.x * factor);
    screen_y = static_cast<int>(p.y * factor);
}

// 计算Comucopia曲面的3D坐标(核心公式实现)
Point3D calculateComucopia(double u, double v) {
    Point3D p;
    
    // 基础指数和三角函数计算(避免重复计算,提升效率)
    double exp_bv = exp(b * v);
    double exp_av = exp(a * v);
    double cos_v = cos(v);
    double sin_v = sin(v);
    double cos_u = cos(u);
    double sin_u = sin(u);
    
    // 严格按你提供的公式计算原始坐标
    p.x = exp_bv * cos_v + exp_av * cos_u * cos_v;
    p.y = exp_bv * sin_v + exp_av * cos_u * sin_v;
    p.z = exp_av * sin_u;
    
    // 应用缩放和偏移(按你的参数配置)
    p.x = p.x * X_SCALE + X_OFFSET;
    p.y = p.y * Y_SCALE + Y_OFFSET;
    p.z = p.z * Z_SCALE + Z_OFFSET;
    
    return p;
}

int main() {        
    // 初始化屏幕和画笔
    screen.title("Comucopia曲面3D旋转_作者:李兴球").bgcolor("black").tracer(0);
    pen.hide().pu();
    
    // 遍历参数u和v的范围(适配Comucopia曲面的形态)
    const int u_steps = 180;  // u方向采样数(u∈[0,2π])
    const int v_steps = 120;  // v方向采样数(v∈[-5,5],覆盖曲面主要形态)
    double u_inc = 2 * PI / u_steps;
    double v_start = -5.0;    // v起始值(避免曲面无限延伸)
    double v_end = 5.0;       // v结束值
    double v_inc = (v_end - v_start) / v_steps;
   
    while (screen.exitonclick()) {        
        screen.clear();   // 清空屏幕(每一帧重新绘制)           
        
        // 遍历所有参数点,计算并绘制曲面
        for (int i = 0; i <= u_steps; ++i) {
            double u = i * u_inc;
            for (int j = 0; j <= v_steps; ++j) {
                double v = v_start + j * v_inc;               
                // 计算Comucopia曲面原始3D坐标
                Point3D p = calculateComucopia(u, v);
                
                // 依次绕X、Y、Z轴旋转,实现动态3D效果
                p = rotateX(p, rotate_angle_x);
                p = rotateY(p, rotate_angle_y);
                p = rotateZ(p, rotate_angle_z);
               
                int x, y;
                project(p, x, y);   // 投影到2D屏幕坐标
                
                // 限制绘制范围,避免超出屏幕可视区域
                if(x >= 400 || x <= -400 || y >= 300 || y <= -300) continue; 
                
                // 彩色绘制点(根据Z坐标生成渐变色彩,增强3D感)
                int color_hue = (static_cast<int>(p.x+p.y+p.z)+100) % 360; // 基于Z轴的色彩渐变
                pen.color(color_hue).penshade(x+y).go(x, y).dot(1);             
            }
        }
        
        // 刷新屏幕,显示当前帧
        screen.update().wait(0.01);
        
        // 调整旋转速度(可自定义,数值越小旋转越慢)
        rotate_angle_x += 0.01;
        rotate_angle_y += 0.02;
        rotate_angle_z += 0.03;
        
        // 重置角度,避免数值溢出
        if (rotate_angle_x > 2 * PI) rotate_angle_x -= 2 * PI;
        if (rotate_angle_y > 2 * PI) rotate_angle_y -= 2 * PI;
        if (rotate_angle_z > 2 * PI) rotate_angle_z -= 2 * PI;
    }
    
    return 0;    
}

视频一开始展示了一段C++代码。这就好比是"食谱",它表明这是作者李兴球通过C++编写的代码,告诉电脑该怎么去画这个图形。标题直接点明了主题:"C++丰饶角曲面3D旋转动画"。

代码运行后,在黑黑的屏幕上(比喻星空)出现了一个由无数绿色和白色小光点组成的物体。

这个视频中演示的动画总体效果看起来像一个发光的螺旋漏斗,或者一个扭曲的无限圆环。它的中心是空的,周围有一圈圈像波纹一样的线条向外扩散。

演示的物体在不停地360度旋转,让你能从各个角度看到它复杂的立体结构,非常有科技感和未来感。

视频中间列出了这个动画的数学公式(X, Y, Z...)。

X(u,v) = exp(b*v) * cos(v) + exp(a*v)*cos(u)*cos(v)

Y(u,v) = exp(b*v)*sin(v) + exp(a*v)*cos(u)*sin(v)

Z(u,v) = exp(a*v)*sin(u)

这其实是在告诉你:这个漂亮的图形不是画家用笔画的,而是电脑根据这些数学公式,计算出亿万个点的位置,然后把它们连起来显示在屏幕上的。

这是一个采用C++精灵库,把枯燥的数学公式变成了一个在太空中旋转的、像绿色星云一样的3D艺术品。

更多文章:

C++罗马曲面3D旋转程序代码解说_C++精灵库应用案例

「本台讯」C++界现"神秘代码":一行指令唤醒沉睡的数学之美

小代码,大视野:评一个典型的"数学可视化 + 计算机图形学入门"的优秀案例(C++精灵库3D案例)

上帝之眼_数理艺术编程_C++精灵库编程案例

爱情表白程序_数学艺术编程的浪漫诗篇_C++精灵库应用案例

罗凯的城市探险:Dijkstra算法之旅

圆到方的"变形记"_数学与编程的完美结合_画圆角矩形

张建国2026到2028信奥课程学习规划书

为何坚决不建议研习C++精灵库?

我们去看看小明和小华交流什么神秘的C++项目吧

精灵潜入C++,莲花咒语显神奇

同学!你见过会"流血"的算法吗?当代码会"燃烧":用C++精灵库画出属于你的星辰大海!

学C++就单一出路走竞赛吗?青少年的C++学习场景正在变得多元

相关推荐
李兴球4 天前
上帝之眼_数理艺术编程_C++精灵库编程案例
c++海龟绘图·c++数学艺术·c++创意编程·c++少儿编程·c++可视化函数·c++数学公式可视化·c++数理编程
李兴球4 天前
爱情表白程序_数学艺术编程的浪漫诗篇_C++精灵库应用案例
c++趣味编程·c++数学编程·c++精灵库案例·c++创意编程·c++粒子效果·c++艺术编程·c++表白程序
李兴球7 天前
圆到方的“变形记”_数学与编程的完美结合_画圆角矩形
c++算法可视化·c++数学艺术·c++数学编程·c++精灵库案例·c++精灵库应用·c++拉梅曲线·c++超椭圆