Bezier 曲线绘制器 - 每日编程实践 2026-02-22
Bezier 曲线绘制器项目概述实现了经典的 Bezier 曲线 绘制算法,支持 2阶、3阶、4阶曲线,使用 De Casteljau 递归算法 实现。这是计算机图形学中最基础也最重要的曲线表示方法,广泛应用于字体设计、矢量图形、动画路径等领域。 📐 数学原理De Casteljau 算法对于 n 个控制点 P₀, P₁, …, Pₙ₋₁,曲线上的点通过递归线性插值计算: 1B(t) = (1-t) · B₀₋ₙ₋₂(t) + t · B₁₋ₙ₋₁(t) 其中 t ∈ [0, 1] 是参数。 具体公式二阶 Bezier(3个控制点)1B(t) = (1-t)² · P₀ + 2(1-t)t · P₁ + t² · P₂ 三阶 Bezier(4个控制点)1B(t) = (1-t)³ · P₀ + 3(1-t)²t · P₁ + 3(1-t)t² · P₂ + t³ · P₃ 🎨 输出效果1. 二阶曲线(抛物线) 特点: 3个控制点 曲线形状类似抛物线 中间控制点拉伸曲线 2. 三阶曲线(S型) 特点: 4个控制点(最常用) 可以形成 S 型或其他复杂形状 ...
每日编程实践: 纹理映射光线追踪器
纹理映射光线追踪器项目目标实现完整的球面UV映射和纹理采样系统,支持在光线追踪器中渲染带纹理的球体。 关键技术: 球面坐标到UV坐标的转换 程序化纹理生成(棋盘格) 材质系统(纹理/纯色混合) 基于UV坐标的纹理采样 实现过程迭代历史 初始版本: 一次性实现完成 球面UV映射公式 (sphereUV) 棋盘格纹理生成 (checkerboardTexture) 材质系统 (hasTexture 标志) 量化验证通过 为什么一次成功? 球面UV映射的数学公式已标准化 使用成熟的反三角函数库 严格的量化验证流程 核心代码球面UV映射123456789101112UV sphereUV(const Vec3& point) { // point 是单位球面上的点 Vec3 p = point.normalize(); // 经度 → u坐标 (使用 atan2 处理方位角) double u = 0.5 + atan2(p.z, p.x) / (2 * M_PI); // 纬度 → v坐标 (使用 ...
每日编程实践: 递归光线追踪 - 折射效果(玻璃球)
递归光线追踪 - 折射效果(玻璃球)项目目标在昨日反射效果的基础上,实现折射效果(Refraction),让玻璃球真正”透明”! 核心技术: Snell 定律(折射方向计算) Fresnel 效应(反射/折射混合) 全反射检测 多材质系统 ⚠️ 重要修复(2026-02-19 10:30)用户反馈的问题: 三个球部分叠在一起 右边金属球看起来像纯透明材质 根本原因: 球体重叠:球心间距 2.5 < 球直径 3.0 金属反射 bug:代码只返回环境反射颜色,没有乘上金属本身的颜色 为什么金属必须乘上颜色? 金属反射 = 环境光 × 金属本身颜色 12345// ❌ 原代码(错误)- 金属变成无色镜子return reflectColor * 0.9;// ✅ 修复后 - 金属显示金黄色return (reflectColor * metalColor) * 0.9; 环境光 金属颜色 反射结果 白光 (1,1,1) 金黄 (0.8,0.6,0.2) 金黄反射 蓝天 (0,0,1) 金黄 (0.8,0.6,0.2) 深蓝 (...
每日编程实践:递归光线追踪 - 镜面反射
递归光线追踪 - 镜面反射日期: 2026-02-18开发时间: 约15分钟迭代次数: 2次技术: 递归光线追踪、镜面反射、Phong光照、阴影 项目目标在之前的 Shadow Ray Tracing 基础上,实现递归光线追踪算法,支持镜面反射效果。通过不同的材质反射率,实现从完全漫反射到高度镜面的多样化材质表现。 核心算法1. 递归光线追踪1234567891011121314151617Vec3 trace(const Ray& ray, const Scene& scene, int depth) { if (depth <= 0) return Vec3(0, 0, 0); // 递归深度限制 // ... 计算直接光照(环境光 + 漫反射 + 镜面高光 + 阴影)... // 递归反射 if (material.reflectivity > 0.0) { Vec3 reflect_dir = ray.direction.reflect(normal); R...
Shadow Ray Tracing - 光线追踪中的阴影算法实现
每日编程挑战:带阴影的光线追踪器今天实现了光线追踪中的阴影算法(Shadow Ray),并结合完整的Phong光照模型,创建了一个支持真实阴影效果的光线追踪渲染器。这是图形学渲染管线中的重要一步,为场景增加了深度感和真实感。 项目概述 实现语言:C++11 核心技术:Shadow Ray + Phong光照模型 + 多光源 输出格式:800×600 PNG图像 开发时长:10分钟(一次性编译成功) 什么是Shadow Ray?在光线追踪中,当主光线(Primary Ray)击中物体表面后,我们需要判断该点是否被其他物体遮挡。**Shadow Ray(阴影光线)**就是从交点向光源发射的一条测试光线。 算法原理12345671. 主光线击中物体表面,得到交点P2. 对场景中的每个光源L: a. 从P向L发射一条Shadow Ray b. 检查Shadow Ray在到达L之前是否击中其他物体 c. 如果击中 → P在阴影中(该光源不贡献光照) d. 如果未击中 → P被照亮(计算该光源的光照贡献)3. 累加所有光源的贡献,得到最终颜色 代码实现1234567891...
Perlin噪声地形生成器 - 程序化地形技术实践
每日编程挑战:Perlin噪声地形生成今天实现了经典的Perlin噪声算法,用于生成自然的2D地形高度图。Perlin噪声是程序化内容生成中最基础也最重要的算法之一,广泛应用于游戏地形、纹理生成和视觉效果制作。 项目概述 实现语言:C++17 算法核心:2D Perlin Noise + Octave叠加 输出格式:512×512 和 1024×1024 PNG灰度高度图 开发时长:7分钟(一次性编译成功) Perlin噪声算法原理Perlin噪声由Ken Perlin在1983年发明,用于解决计算机图形学中自然纹理生成的问题。该算法的核心思想是在网格点上定义随机梯度向量,然后通过平滑插值计算任意点的噪声值。 算法流程 网格定位 将输入坐标映射到整数网格 计算点在网格单元内的相对位置 梯度向量 为每个网格点分配随机梯度向量 计算输入点到四个角点的距离向量 计算距离向量与梯度向量的点积 平滑插值 使用fade函数对相对坐标进行平滑处理 进行双线性插值得到最终噪声值 核心代码实现1. Perlin噪声基础函数123456789101112131415161718...
光线追踪:球体相交检测实现 - 图形学每日挑战
每日编程挑战:光线与球体相交检测可视化今天完成了光线追踪中的基础计算——光线与球体相交检测。这是光线追踪算法中最核心的几何计算之一,通过检测光线与球体的交点,为后续的材质、光照和阴影计算奠定基础。 项目概述 实现语言:C++ (C++11标准) 算法核心:光线-球体相交的几何计算 输出格式:400×300像素PNG图像 场景内容:单个球体,多方向光线可视化 核心算法:光线-球体相交光线与球体的交点计算是光线追踪的基础问题。使用几何方法可以高效地计算交点。 数学公式推导设: 光线:R(t) = O + t·d(O为原点,d为方向向量,t为参数) 球体:中心C,半径r,满足 ||P - C||² = r² 将光线方程代入球体方程:||O + t·d - C||² = r² 展开得:(O - C + t·d) · (O - C + t·d) = r² 令 OC = O - C,则:(OC + t·d) · (OC + t·d) = r²OC·OC + 2t(OC·d) + t²(d·d) = r² 整理得到一元...
Bresenham直线绘制算法实践 - 图形学每日挑战
每日编程挑战:Bresenham直线算法实现今天完成了图形学中的一个经典算法——Bresenham直线绘制算法。这是早期的计算机图形显示中发明的算法,使用整数运算避免了浮点运算的性能开销。 项目概述 实现语言:C++17 算法核心:Bresenham整数直线算法 输出格式:800x600像素PNG图像 绘制内容:10条不同方向的直线 算法原理Bresenham算法的核心思想是使用整数误差项来决定像素点的选择。算法步骤如下: 计算dx = |x₂ - x₁|, dy = |y₂ - y₁| 判断步进方向:sx = (x₁ < x₂ ? 1 : -1), sy = (y₁ < y₂ ? 1 : -1) 初始化误差项:err = dx - dy 循环绘制: 如果err² > -dy,则err -= dy,x₁ += sx 如果err² < dx,则err += dx,y₁ += sy 1234567891011121314151617181920212223242...
每日编程实践:简单的光线追踪器渲染球体
每日编程实践:简单的光线追踪器渲染球体今天的目标是构建一个简单的光线追踪器来渲染一组球体场景,继续探索图形学中的光线追踪基础知识。 项目概述 项目名称: 简单的光线追踪器渲染球体 开发时间: 约15分钟 代码量: 143行 C++ 迭代次数: 1次(首次编译有小问题) 编译状态: ✅ 编译成功(0错误0警告) 运行结果: ✅ 成功生成600×400像素光线追踪图像 项目地址: GitHub - daily-coding-practice 技术要点光线追踪基本原理光线追踪的核心思想是从相机发射光线穿过每个像素,检测光线与场景中的物体是否相交,然后计算相交点的颜色。 三维向量运算实现光线追踪涉及大量的三维向量运算,为此需要实现基础的向量数学: 123456789struct Vec3 { float x, y, z; Vec3 operator+(const Vec3& v) const { return Vec3(x + v.x, y + v.y, z + v.z); } Vec3 operator-(const...
Voronoi 图生成器 - 计算几何的暴力之美
Voronoi 图生成器 - 计算几何的暴力之美今天实现了经典的 Voronoi 图生成器,虽然使用暴力法(O(N×W×H)),但展示了计算几何的直观本质。 本项目代码已托管至 GitHub每日编程实践项目,记录每天的学习和实现。 https://github.com/chiuhoukazusa/daily-coding-practice/tree/main/2026/02/02-11-voronoi-generator 项目简介Voronoi 图是计算几何中非常重要的一种空间划分方法,将平面划分为若干个区域,每个区域内点到该区域对应的种子点的距离比到其他种子点更近。 开发时间: 约 13 分钟 代码量: 75 行 C++ 编译状态: ✅ 一次编译成功(0 错误,0 警告) 运行结果: ✅ 成功生成 800×600 像素的 Voronoi 图 技术要点Voronoi 图算法暴力法实现(Brute-force): 1234567891011121314151617181920for (int y = 0; y < height; y++) { for (...















