Bresenham画圆算法:整数微分与八分对称的嵌入式图形实现
1. 为什么Bresenham画圆算法至今仍是图形学入门必修课你有没有试过在没有任何图形库支持的裸机环境里只靠一个像素点一个像素点地“手写”出一个圆不是调用drawCircle(x, y, r)而是真正从零开始推导给定圆心坐标和半径如何仅用整数加减和位移运算让屏幕上每一个被点亮的像素都精准落在数学意义上的圆周附近且整个过程不依赖浮点运算、不开方、不查表、不调用任何外部函数——这就是Bresenham八分法画圆要解决的问题。它不是教科书里一个被束之高阁的“历史算法”而是图形学底层逻辑的一次微型实战沙盘。我第一次在某嵌入式图像处理Demo中实现它时目标设备是一块主频仅72MHz的ARM Cortex-M4芯片内存紧张到连最轻量级的FreeType字体渲染都得裁剪掉抗锯齿模块。当时团队要求在LCD屏上实时绘制动态轨迹圆比如雷达扫描线、传感器覆盖范围示意而系统连标准C库的sqrt()函数都因浮点单元未启用而被编译器禁用。我们翻遍SDK文档发现所有GUI层API都要求先构造完整路径再批量刷新——这对毫秒级响应的交互场景来说太重了。最终一行行手敲的Bresenham循环成了唯一可行方案。实测下来一个半径64像素的圆纯整数运算耗时仅38微秒比调用系统API快4倍以上且内存占用恒定为O(1)。这个算法之所以能穿越四十多年仍被反复教学并非因其“古老”而在于它把三个关键能力压缩进不到50行代码里几何离散化的精确建模能力、计算资源受限下的极致优化意识、以及对“像素即世界”的底层硬件敬畏感。它不教你如何堆砌炫酷特效而是逼你直面“屏幕到底由什么构成”这个根本问题。关键词里虽未明写但隐含的核心其实是整数微分、对称性复用、误差累积控制、逐像素决策机制。这些概念在现代GPU着色器编写、FPGA图像流水线设计、甚至AI模型推理中的量化部署里都能找到它的精神投影——只是换了一身马甲罢了。很多人误以为学Bresenham是“复古情怀”其实恰恰相反它是帮你甩掉高级抽象依赖的卸妆水。当你能徒手写出一个无浮点、无分支预测失败惩罚、缓存友好的圆生成器时你对现代图形管线的理解会从“API怎么调”下沉到“GPU光栅化器内部到底在算什么”。这种认知降维正是资深从业者与调包侠之间那道看不见的墙。2. 八分法的本质不是偷懒而是对称性驱动的计算压缩先破除一个常见误解“八分法”听起来像把圆切成八块然后各画一份——这完全错了。它真正的精妙之处在于利用圆的八重对称性将原本需要计算全部360°像素点的暴力穷举压缩为仅需计算第一象限内45°弧段即从0°到45°的数学推演再通过坐标变换批量生成其余七份。为什么偏偏是45°因为这是第一象限内x和y增长速率发生质变的临界点。在0°到45°区间圆弧的斜率绝对值小于1意味着x方向每走1步y方向最多变化不到1个像素——此时我们以x为自变量y为因变量而过了45°后斜率绝对值大于1y增长更快若继续以x为步进主轴会导致大量y值重复或跳跃。Bresenham的智慧在于只在一个单调递增且步长可控的区间内做核心迭代其余部分全靠镜像反射。具体怎么镜像我们以圆心在原点(0,0)、半径r的圆为例。假设你在第一象限算出了一个有效像素点(x, y)那么根据圆的对称性立刻可得另外七个点对称类型坐标变换物理意义关于x轴对称(x, -y)第四象限点关于y轴对称(-x, y)第二象限点关于原点对称(-x, -y)第三象限点关于直线yx对称(y, x)第一象限内45°线另一侧点关于直线y-x对称(-y, x)第二象限内45°线另一侧点关于直线yx再x轴对称(y, -x)第四象限内45°线另一侧点关于直线y-x再y轴对称(-y, -x)第三象限内45°线另一侧点提示实际编程中我们通常将圆心平移到屏幕坐标系原点即先减去cx,cy完成八分点计算后再统一加回偏移量。这样避免在每次坐标变换时重复加减提升缓存局部性。但这里有个隐藏陷阱当x0或y0时某些镜像点会重合比如(0,r)关于x轴对称还是(0,r)。初学者常因此在边界处画出重复像素或漏点。我的经验是在循环中始终以x从0递增到r/√2约0.707r为界当xy时单独处理该点避免条件分支干扰主循环节奏。实测在STM32F4系列MCU上这种处理比用if判断是否重合快12%——因为现代CPU的分支预测器对这种规律性循环更友好。更深层的价值在于八分法教会你一种工程思维面对指数级复杂度问题优先寻找内在对称性或不变量将其转化为线性可解结构。这和现代分布式系统中用一致性哈希替代取模分片、或编译器优化中用SSA形式消除冗余计算本质逻辑一脉相承。它不是“少算”而是“用更少的确定性计算驱动更多确定性结果”。3. Bresenham核心用整数误差项替代浮点距离比较现在进入算法心脏——为什么不用sqrt((x-xc)²(y-yc)²)直接比大小而要发明一个叫“决策参数”d的东西答案直指嵌入式开发最痛的神经浮点运算的硬件代价。以ARM Cortex-M系列为例启用FPU后单次sqrtf()耗时约18个周期而一次整数加法仅1个周期。更致命的是浮点运算会触发额外的寄存器保存/恢复开销在中断密集场景下可能引发不可预测延迟。Bresenham的革命性在于把连续空间的距离比较离散化为相邻像素间的整数差值判别。我们聚焦第一象限0°~45°弧段。设当前已确定像素为(x_k, y_k)下一步候选点有两个正右方的E点(x_k1, y_k)或右下方的SE点(x_k1, y_k-1)。选哪个数学上应选离理想圆周更近的那个。理想圆方程为x²y²r²定义误差函数F(x,y)x²y²-r²。注意F(x,y)在圆内为负圆上为0圆外为正。关键洞察来了我们不直接计算F(E)和F(SE)的绝对值而是计算它们的差值ΔF(SE)-F(E)。因为只要知道Δ的符号就能判断哪个点更优——若Δ0说明SE比E更靠近圆因为F(SE)更接近0反之则选E。展开计算F(E) (x_k1)² y_k² - r²F(SE) (x_k1)² (y_k-1)² - r² (x_k1)² y_k² - 2y_k 1 - r²所以 Δ F(SE) - F(E) -2y_k 1但这还不够因为我们需要一个能递推更新的参数而不是每次都重新计算。Bresenham定义决策参数d_k F(x_k1, y_k-0.5)即在x方向前进1步后y方向取中间值时的误差。为什么要取y_k-0.5因为这是E点和SE点的y坐标中点用它作判据能保证选择结果严格满足“最近邻”原则。于是d_k (x_k1)² (y_k-0.5)² - r²当d_k 0时选E点y不变当d_k ≥ 0时选SE点y减1。接下来推导d_{k1}的递推式若选E点y_{k1}y_kd_{k1} (x_k2)² (y_k-0.5)² - r² d_k 2x_k 3若选SE点y_{k1}y_k-1d_{k1} (x_k2)² (y_k-1.5)² - r² d_k 2x_k - 2y_k 5初始值d_0怎么定从起点(0,r)开始第一步x1,yr-0.5d_0 (01)² (r-0.5)² - r² 1 r² - r 0.25 - r² 1.25 - r但这里出现小数Bresenham的终极技巧来了将整个误差项乘以4彻底消除小数。定义p_k 4*d_k则p_0 4*(1.25 - r) 5 - 4r若选E点p_{k1} p_k 8x_k 12若选SE点p_{k1} p_k 8x_k - 8y_k 20注意所有系数都是4的倍数确保全程整数运算。我在某工业HMI项目中曾因忘记乘4导致圆出现明显阶梯状锯齿调试三天才发现是初始p_0用了3-4r而非5-4r——这个细节必须刻进DNA。这个推导过程看似繁琐但它揭示了一个底层真理所有“高效算法”的本质都是用预计算的整数差分替代实时的浮点距离评估。现代GPU的光栅化器里Bresenham思想以硬件电路形式存在WebGL的gl.drawArrays()背后驱动程序仍在用类似逻辑决定哪些像素该被着色。理解p_k的物理意义它本质是两倍的“垂直距离误差”比死记公式重要十倍。4. 工业级实现从伪代码到可交付代码的七道坎理论推导再完美落地时也会被现实毒打。我整理了在五个不同平台ARM Cortex-M4、RISC-V Linux、ESP32-S3、树莓派Pico、自研FPGA视频控制器实现Bresenham画圆时踩过的典型坑按严重程度排序4.1 坐标溢出32位int的隐形杀手当半径r46340时计算x²y²会溢出32位有符号整数因为46340²≈21.47亿接近2³¹-1。很多教程直接用int x,y;声明测试时用r100没问题量产时客户传r50000就崩溃。解决方案用long long存储中间平方项但增加指令周期更优解改用增量式计算避免存x²/y²。例如p_k递推式中8x_k可由前次x_k-1的值累加得到全程不涉及平方我在某医疗影像设备固件中采用第三种方案限定r≤32767超限时自动降采样并抛出警告——因为临床显示根本不需要超大半径圆4.2 像素填充顺序引发的撕裂在双缓冲LCD屏上若八分点不是原子性写入可能出现“半圆已显另半圆未刷”的视觉撕裂。尤其当SE点更新y值时若恰好被VSYNC中断打断会看到错位圆弧。解决方法关闭全局中断仅适用于裸机推荐将八个对称点坐标先存入临时数组确认无误后再批量写入帧缓冲区在Linux用户态用mmap()映射显存后配合pthread_mutex_t保护临界区4.3 抗锯齿缺失导致的主观质量下降Bresenham输出的是硬边圆但在高DPI屏上边缘锯齿明显。有人试图在每个像素点加权混合但这违背了算法初衷。我的折中方案保留Bresenham主循环生成“中心线”额外计算每个像素到理想圆周的归一化距离d_norm∈[0,1]根据d_norm查表获取alpha值如d_norm0.3→alpha2550.3~0.7→alpha1280.7→alpha0这样既保持核心算法轻量又获得可接受的视觉质量4.4 编译器优化陷阱GCC的-O3可能将p_k递推式中的8*x_k优化为x_k3这本身没问题。但若x_k是volatile比如映射到硬件寄存器某些旧版编译器会错误地认为x_k3不改变x_k值而删除该操作。解决方案显式使用__attribute__((optimize(O2)))为该函数降级优化或强制用asm volatile内联汇编保证顺序4.5 内存对齐导致的DMA传输故障在用DMA向LCD发送像素数据时若八分点坐标数组未按4字节对齐某些SoC的DMA控制器会静默丢弃最后几个字节。用__attribute__((aligned(4)))修饰数组可根治。4.6 浮点转整数的截断偏差当圆心坐标(cx,cy)来自浮点计算如GPS定位转换直接(int)cx会向零截断。应改用lroundf(cx)它遵循IEEE舍入规则对0.5以上向上取整避免系统性偏移。4.7 调试可视化盲区最难调试的是“看起来画对了但精度损失在亚像素级”。我开发了一个辅助工具用Python生成Bresenham算法的逐点坐标序列再用Matplotlib绘制理想圆红色与算法输出蓝色点叠加显示每个点的误差向量绿色箭头。这种可视化让误差分布一目了然——比如发现某批次芯片的乘法器有微小偏差导致p_k累积误差偏向一侧。注意上述所有问题在我经手的17个嵌入式图形项目中有12个首次调试时都至少遇到其中三项。它们不会出现在教科书里却是工程落地的真实门槛。5. 超越画圆Bresenham思想在现代系统中的隐性传承如果你以为Bresenham只属于计算机图形学课本那就低估了它的生命力。事实上它的核心范式——用整数微分替代浮点积分、用对称性压缩状态空间、用误差累积控制离散化偏差——正以更隐蔽的方式活跃在当代技术栈中。5.1 GPU光栅化管线中的幽灵现代GPU的光栅化器Rasterizer在决定一个三角形覆盖哪些像素时其核心算法就是Bresenham的高维扩展。NVIDIA的白皮书明确提到其Turing架构的“Pixel Coverage Unit”使用改进型Bresenham算法计算边缘像素的覆盖率Coverage。区别在于它把决策参数从标量p_k升级为二维向量把“选E还是SE”扩展为“选哪条边缘子线段”但误差累积与递推更新的哲学完全一致。当你在Unity中开启MSAA时背后运行的正是这种思想的并行化实现。5.2 电机运动控制里的孪生兄弟某伺服电机控制系统要求机械臂末端沿圆弧轨迹匀速运动。工程师发现若用浮点插值计算每毫秒位置编码器反馈会出现周期性抖动。最终方案是将圆弧离散为N个点用Bresenham思想生成整数步进序列再通过查表将整数索引映射为PWM占空比。实测轨迹抖动降低83%因为整数运算消除了浮点舍入的随机性。5.3 AI模型量化部署的底层逻辑在将ResNet-50部署到端侧芯片时我们需将FP32权重量化为INT8。量化误差的传播分析本质上就是在构建一个高维“误差累积模型”——这和Bresenham中p_k的递推式异曲同工。某次调试发现某层卷积的量化误差总在特定输入模式下突增最后追溯到权重矩阵的稀疏性破坏了误差抵消的对称性解决方案竟是借鉴Bresenham的“误差重置”策略在每16次计算后强制清零累积误差寄存器。5.4 Web前端性能优化的意外启示在开发一个实时协作白板应用时多人同时画圆会产生大量重叠像素。前端工程师最初用Canvas API的arc()方法但高并发下CPU占用飙升。后来改用WebAssembly编译的Bresenham实现将圆分解为独立像素点阵列再用putImageData()批量写入。性能提升40%因为避免了Canvas 2D上下文的状态切换开销——这恰是Bresenham“最小化状态依赖”思想的胜利。这些案例共同指向一个事实Bresenham从未过时它只是从显性算法退居为隐性范式。当你在调试GPU着色器时怀疑光栅化精度在优化电机控制算法时纠结插值方式在部署AI模型时分析量化误差在写前端代码时权衡API调用粒度——你都在与Bresenham的灵魂隔空对话。它教给我们的不是如何画圆而是如何在资源约束下用最朴素的工具逼近最理想的数学模型。6. 实战代码一个经过生产环境验证的C语言实现以下是我维护的嵌入式图形库gfx_core中draw_circle()函数的精简版已移除平台相关宏保留核心逻辑。它通过了MISRA-C:2012全部静态检查且在IAR EWARM 8.50编译器下生成的汇编代码无跳转指令纯线性执行#include stdint.h #include stdbool.h // 像素写入回调函数原型需用户实现 typedef void (*pixel_writer_t)(int16_t x, int16_t y, uint32_t color); // 八分点坐标生成器避免重复计算 static inline void plot_eight_points(int16_t cx, int16_t cy, int16_t x, int16_t y, pixel_writer_t write_pixel, uint32_t color) { // 使用宏展开而非函数调用避免栈操作开销 #define PLOT(px, py) write_pixel((px) cx, (py) cy, color) PLOT(x, y); // 第一象限 PLOT(y, x); // 关于yx对称 PLOT(-x, y); // 第二象限 PLOT(-y, x); // 第二象限对称 PLOT(-x, -y); // 第三象限 PLOT(-y, -x); // 第三象限对称 PLOT(x, -y); // 第四象限 PLOT(y, -x); // 第四象限对称 #undef PLOT } // 主绘制函数r为uint16_t确保x,y不溢出 void draw_circle(int16_t cx, int16_t cy, uint16_t r, pixel_writer_t write_pixel, uint32_t color) { if (r 0) { write_pixel(cx, cy, color); return; } // 初始化从(0,r)开始p0 5 - 4*r已乘4消除小数 int32_t p 5 - ((int32_t)r 2); // r2 等价于 r*4 int16_t x 0; int16_t y r; // 绘制起始点x0,yr的八分点 plot_eight_points(cx, cy, x, y, write_pixel, color); // 主循环x从0递增到y即到达45°线 while (x y) { x; // x总是递增 if (p 0) { // 选择E点y不变p更新为 p 8*x 12 p ((int32_t)x 3) 12; // x3 等价于 x*8 } else { // 选择SE点y减1p更新为 p 8*x - 8*y 20 y--; p ((int32_t)x 3) - ((int32_t)y 3) 20; } // 绘制当前(x,y)的八分点 plot_eight_points(cx, cy, x, y, write_pixel, color); } }这段代码的关键设计选择及其理由int32_t p类型确保p值在r≤32767时永不溢出最大p值约2^25远小于2^31位移替代乘法x3比x*8在ARM Thumb-2指令集下少1个周期且无乘法器占用无分支绘图plot_eight_points用宏展开避免函数调用开销八分点坐标计算全为加减无条件跳转边界处理循环条件x y天然包含45°截止无需额外判断xy零半径特例单独处理r0避免主循环中y--导致负值我在某车载仪表盘项目中用此函数每秒绘制200个动态圆半径随车速变化在Cortex-M7300MHz上CPU占用率仅1.2%。对比调用LVGL的lv_draw_arc()后者在相同场景下占用率达9.7%——差异源于Bresenham的O(r)时间复杂度与LVGL的O(r²)路径构造开销。最后分享一个调试技巧在plot_eight_points开头插入if (x1 yr-1) { __BKPT(0); }设置条件断点捕捉第一个决策点用逻辑分析仪抓取此时的p值与手算5-4r比对。这招帮我快速定位过三次编译器常量折叠bug。这个函数没有炫技没有抽象甚至不配拥有一个花哨的名字。但它像一把瑞士军刀在资源吃紧的战场上永远能可靠地完成最基础也最重要的任务——把数学世界的圆忠实地映射到物理世界的像素阵列中。

相关新闻

Agent沙箱设计实战:轻量级隔离环境搭建与四大边界控制

Agent沙箱设计实战:轻量级隔离环境搭建与四大边界控制

1. 项目概述:沙箱不是“装沙子的盒子”,而是AI时代最基础的安全操作台最近刷技术社区、听分享会、甚至看招聘JD,几乎每三句话就蹦出一个“沙箱”——Agent开发要跑在沙箱里,大模型调用要进沙箱隔离,RAG流程得先过沙箱校…

2026/10/13 2:55:39 阅读更多 →
管家婆数据库自动备份:SQL Server维护计划向导配置指南

管家婆数据库自动备份:SQL Server维护计划向导配置指南

开头先问一个问题:你有多久没备份过管家婆的数据了?一个月?三个月?还是装上之后就没管过?大部分用管家婆单机版的用户,其实根本没把备份当回事。总觉得反正装在办公室电脑上,天天能看到&#xf…

2026/10/13 2:55:39 阅读更多 →
117-杨逢昌:班组巡检台账分类统计高频问题,驱动车间月度优化迭代

117-杨逢昌:班组巡检台账分类统计高频问题,驱动车间月度优化迭代

《6S管理实战专栏》 三环实战篇(第117篇) 杨逢昌使命: 用6S的力量,让10万名朋友实现高效愉悦的生活与工作。文本导读:多数车间巡检台账只记录不统计,同类问题反复发生。依托《杨逢昌 6S 诊断・治疗・执行三…

2026/10/13 2:55:39 阅读更多 →

最新新闻

被动审计实战:用icedump与nticedump实现内网资产盘点与风险发现

被动审计实战:用icedump与nticedump实现内网资产盘点与风险发现

简介:这份zip合集提供icedump 6.026与nticedump 1.14两套经典调试工具的完整文件包,面向系统程序员、逆向工程师与安全研究人员,覆盖用户态进程内存分析和Windows NT内核级转储两大场景。压缩包共含410个文件,整体仅2.62MB&#x…

2026/10/13 3:39:53 阅读更多 →
中国象棋源码实战:规则引擎与状态空间建模

中国象棋源码实战:规则引擎与状态空间建模

简介:这是一份面向Java初学者的中国象棋桌面程序源码学习项目,适用于算法逻辑训练、GUI开发入门与网络编程实践。项目实现了基础棋盘交互、走子规则校验、悔棋功能及简易联网对战模块,代码经过变量与函数重命名优化,并添加必要中文…

2026/10/13 3:39:53 阅读更多 →
Linux 服务器用 Aspera/ascp 高速下载基因组数据的完整指南

Linux 服务器用 Aspera/ascp 高速下载基因组数据的完整指南

简介:这是一款专为基因组大数据传输设计的高速下载工具——Aspera Connect 3.7.4.147727 Linux 64 位安装包,面向生物信息学研究人员、生信初学者以及需从 NCBI、EBI 等公共数据库批量获取测序数据的使用者。它基于 IBM FASP 协议,能够有效规…

2026/10/13 3:39:53 阅读更多 →
计算机系统考点梳理:补码、栈帧与缓存刷题技巧

计算机系统考点梳理:补码、栈帧与缓存刷题技巧

大二上那门计算机系统课,我是被“做题家”三个字摁着脑袋走完的。一开始觉得这只是自嘲,好像谁刷题多、背得熟,谁就是不懂原理的考试机器;等真到了期末复习,我才发现这门课光靠“看懂”完全不够,你必须在纸…

2026/10/13 3:39:53 阅读更多 →
SpringBoot+Vue校园一卡通系统实战:从架构设计到部署上线全解析

SpringBoot+Vue校园一卡通系统实战:从架构设计到部署上线全解析

校园一卡通项目我前后做过好几个版本,从最初的单体JSP到后面的前后端分离,踩过的坑能写满一个笔记本。这次分享的基于SpringBoot加Vue的校园一卡通管理系统,是目前结构最清晰、也最适合拿来学习和二次开发的一套。无论是应付毕业设计&#xf…

2026/10/13 3:39:53 阅读更多 →
Flutter for OpenHarmony实战:二手置换App设置页开发全解析

Flutter for OpenHarmony实战:二手置换App设置页开发全解析

做Flutter for OpenHarmony二手物品置换App,设置页看起来是所有模块里最不起眼的那一个。真正动手写的时候你会发现,它几乎是整个App里横跨技术面最杂的页面:本地存储、主题切换、通知权限、缓存清理、账号安全全都要在这个页面里落地&#x…

2026/10/13 3:38:53 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →