
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++学习场景正在变得多元