VB.NET实现非均匀B样条曲线:算法解析与交互绘制工具
简介基于VB.NET实现的非均匀B样条NURBS曲线示例工程面向计算机图形学与CAD建模方向的开发者解决自定义曲线生成与控制点编辑问题。源码覆盖控制点、权重、Knot向量定义以及曲线求值、节点插入和逆算等关键算法适合用作二维、三维建模工具或教学演示的基础。压缩包总共59个文件其中包括13个VB语言源程序、13个动态链接库、5个可执行程序、4个XML配置文件以及项目结构、窗体资源、调试符号等辅助内容源码内包含NL_B_Spline系列类、窗体界面与二维绘制模块相关文件齐备整体大小仅213KB结构紧凑清晰。已有184人学习浏览。通过该工程可以直观理解非均匀B样条的基函数计算与节点规律为后续扩展NURBS曲面或对接图形渲染引擎提供可复用代码并便于二次开发。1. 非均匀B样条曲线为什么VB.NET反而是高效的落地选择非均匀B样条曲线在CAD/CAM和测量数据拟合里是绕不开的基础算法但大多数教程默认你用C或C#来写。我第一次在项目中需要把非均匀B样条曲线做成交互式桌面工具时选了VB.NET和WinForms这个选择被同事质疑过实际推进却发现GDI绘图、控件数据绑定、数学类库的配合非常自然曲线重绘和鼠标拖拽控制点几乎不需要额外框架。这套源码就是这样一个完整的桌面工具你输入一组控制点坐标程序自动生成节点向量、递推基函数、反算控制点并在画布上实时绘制曲线。适合正在做样条拟合、刀具路径预览或二维曲线编辑器的人也适合想把B样条底层搞懂再封装成自己工具的人。2. 算法底座与工程结构节点向量、基函数与模块划分2.1 非均匀B样条和均匀B样条的分水岭节点向量一条p次B样条曲线定义为C(u)等于N(i,p)(u)与P(i)的加权和P(i)是控制点N(i,p)(u)是p次基函数u的取值范围由节点向量决定。节点向量就是非均匀和均匀的分界点。均匀样条的节点是[0,1,2,3,...]这样等距排列节点间隔完全相等非均匀样条的节点间隔不一致而且通常首尾各保留p加1个重复节点让曲线强制经过首尾控制点。为什么强调非均匀因为等距节点在处理分布不均匀的控制点时会出现“削峰”现象控制点密集区域的细节被平滑掉。用累积弦长重新分配节点后每个节点区间长度和实际数据点之间的距离成正比曲线才更贴合真实形状。这就是“非均匀”三个字的核心价值节点向量变成了控制曲线形状的第二个旋钮。Public Function BuildChordKnots(controlPoints As List(Of PointF), degree As Integer) As Double() Dim n As Integer controlPoints.Count - 1 Dim m As Integer n degree 1 Dim knots(m) As Double For i As Integer 0 To degree knots(i) 0.0 knots(m - i) 1.0 Next Dim totalLen As Double 0.0 For i As Integer 1 To n totalLen EuclideanDistance(controlPoints(i - 1), controlPoints(i)) Next Dim cum As Double 0.0 Dim innerIndex As Integer degree 1 For i As Integer 1 To n - degree cum EuclideanDistance(controlPoints(i - 1), controlPoints(i)) knots(innerIndex) cum / totalLen innerIndex 1 Next Return knots End Function这里有几个参数要解释清楚controlPoints是控制点列表degree是B样条次数。n是控制点最大下标m是节点向量末下标节点向量总长度是m加1满足m等于n加degree加1这个基本约束。外层循环把首尾各degree加1个节点分别设为0和1内层循环则从第一个到第n-degree个分段距离累加出中间节点最后节点值落在0到1之间。这样生成的节点向量中内部节点间距与控制点的实际距离成正比也就是累积弦长参数化。2.2 基函数递推Cox-de Boor递归公式基函数是所有B样条计算的地基。B样条的基函数用Cox-de Boor公式递推定义零次基函数在节点区间内取1其他为0高次基函数由两个低次基函数线性组合得到。这个递归形式写起来很直观也最适合和教材公式对照学习。Public Function Basis(i As Integer, k As Integer, u As Double, knots As Double()) As Double If k 0 Then If u knots(i) AndAlso u knots(i 1) Then Return 1.0 Else Return 0.0 End If Else Dim coef1 As Double 0.0 Dim coef2 As Double 0.0 If knots(i k) - knots(i) 0 Then coef1 (u - knots(i)) / (knots(i k) - knots(i)) * Basis(i, k - 1, u, knots) End If If knots(i k 1) - knots(i 1) 0 Then coef2 (knots(i k 1) - u) / (knots(i k 1) - knots(i 1)) * Basis(i 1, k - 1, u, knots) End If Return coef1 coef2 End If End Function参数i是基函数序号k是剩余次数u是参数值。零次情况判断u是否落在第i个节点区间内注意右边界是开区间这是为了保证每个u只属于一个区间。高次情况里两个分母为0的项会被跳过因为节点重复时对应系数在数学上按0处理。这个边界处理是几乎所有B样条越界bug的来源后面避坑章节会专门讲。当然递归的缺点也明显一次曲线点计算要触发大量函数调用。项目里的BSplineCurve类实际使用的是De Boor递推算法比直接累加基函数更稳定高效。这里保留递归版本主要是为了单步调试和理解数学定义。2.3 工程目录结构算法层和UI层分离拿到源码包后先看目录整体结构是这样的BSplineLab/ ├─ BSplineLab.sln └─ BSplineLab/ ├─ App.config ├─ MainForm.vb ├─ MainForm.Designer.vb ├─ KurveMath/ │ ├─ KnotVectorBuilder.vb │ ├─ BasisFunction.vb │ ├─ BSplineCurve.vb │ └─ ControlPointSolver.vb └─ UI/ └─ CurvePanel.vbKurveMath是纯算法命名空间不引用任何WinForms类型这是这套源码最值得保留的设计。KnotVectorBuilder负责生成节点向量BasisFunction提供基函数递归计算BSplineCurve封装FindSpan和De Boor求值ControlPointSolver负责反算控制点。UI目录下的CurvePanel是自定义控件专门处理鼠标路由和画布绘制。MainForm只做菜单、参数面板和状态栏。这个分离带来的直接好处是算法层可以单独做单元测试也可以整体搬到控制台或类库项目而不碰UI代码。后面二次开发章节会进一步说明怎么把这一层拆出来。3. 核心代码拆解从控制点到曲线点的完整计算链路3.1 FindSpan与De Boor递推曲线点的标准求法计算B样条曲线上任意参数u对应的点第一步是在节点向量中定位u落在哪个节点区间这个定位动作叫FindSpan。项目里用二分搜索实现边界条件处理是重点。Public Function FindSpan(n As Integer, degree As Integer, u As Double, knots As Double()) As Integer If u knots(n 1) Then Return n If u knots(degree) Then Return degree Dim low As Integer degree Dim high As Integer n 1 Dim mid As Integer (low high) \ 2 While u knots(mid) OrElse u knots(mid 1) If u knots(mid) Then high mid Else low mid End If mid (low high) \ 2 End While Return mid End Functionn是控制点最大下标degree是次数。当u等于最大节点值时直接返回n这个判断不能省否则后面访问knots(mid1)时可能越界。找到区间后De Boor算法从degree加1个相邻控制点开始逐层做线性插值每降一阶点数少一个最后剩下一个点就是曲线点。Public Function ComputePoint(controlPoints As PointF(), degree As Integer, knots As Double(), u As Double) As PointF Dim n As Integer controlPoints.Length - 1 Dim span As Integer FindSpan(n, degree, u, knots) Dim d(degree) As PointF For j As Integer 0 To degree d(j) controlPoints(span - degree j) Next For r As Integer 1 To degree For j As Integer degree To r Step -1 Dim idx As Integer span - degree j Dim denominator As Double knots(idx degree - r 1) - knots(idx) Dim alpha As Double 0.0 If denominator 0 Then alpha (u - knots(idx)) / denominator d(j).X alpha * d(j).X (1 - alpha) * d(j - 1).X d(j).Y alpha * d(j).Y (1 - alpha) * d(j - 1).Y Next Next Return d(degree) End Functionalpha是一个0到1之间的比例系数表示当前点在该层插值中的位置。内层循环必须从degree向下到r反过来更新因为后一个点的计算要依赖前一轮的值正序会覆盖掉中间结果。这个反向更新是De Boor实现里最容易写错的地方一旦顺序错曲线会出现奇怪的突变。3.2 控制点反算插值模式下的线性方程组求解很多实际场景拿到的不是控制点而是一组“希望曲线穿过”的型值点。比如在界面上手绘一条折线要求B样条拟合后经过折线顶点。此时需要反算控制点。原理是让C(u(i))等于Q(i)也就是把每个型值点代入B样条方程得到一个以控制点为未知数的线性方程组。系数矩阵第i行就是各个基函数在参数u(i)处的取值。项目里用弦长参数化生成节点向量再为每个数据点分配参数值然后解方程组。Public Function FitControlPoints(dataPoints As PointF(), degree As Integer, knots As Double()) As PointF() Dim n As Integer dataPoints.Length - 1 Dim mat(n, n) As Double Dim rhsX(n) As Double Dim rhsY(n) As Double For i As Integer 0 To n Dim u As Double GetChordParam(i, dataPoints) For j As Integer 0 To n mat(i, j) BasisFunction.Basis(j, degree, u, knots) Next rhsX(i) dataPoints(i).X rhsY(i) dataPoints(i).Y Next Dim solver As New LinearSolver(mat, rhsX, rhsY) solver.Solve() Return solver.GetResult() End FunctiondataPoints是型值点数组degree是次数knots是已经构建好的节点向量。GetChordParam根据数据点在弦长中的累计比例返回参数u。这里用的是稠密矩阵解算因为非均匀节点会让系数矩阵失去严格三对角结构如果控制点数量上千实际工程会改成带状矩阵存储和带状高斯消元内存占用能从O(n平方)降到O(n乘degree)。3.3 实时绘制Paint事件和鼠标操作的配合曲线交互是这套源码体验的核心。CurvePanel重写了OnPaint每次参数变化都触发刷新绘制逻辑分两层先画控制点和连线再按固定采样步长取曲线点画折线。Private Sub CurvePanel_Paint(sender As Object, e As PaintEventArgs) Handles CurvePanel.Paint Dim g As Graphics e.Graphics g.SmoothingMode Drawing2D.SmoothingMode.AntiAlias For i As Integer 0 To controlPoints.Count - 1 g.FillEllipse(Brushes.Red, controlPoints(i).X - 3, controlPoints(i).Y - 3, 6, 6) Next Dim stepCount As Integer 200 Dim pts As New List(Of PointF)() For i As Integer 0 To stepCount Dim u As Double knots(degree) (knots(n 1) - knots(degree)) * i / stepCount pts.Add(curve.ComputePoint(controlPoints.ToArray(), degree, knots, u)) Next g.DrawLines(Pens.Blue, pts.ToArray()) End SubstepCount取200是默认值高次数或尖锐曲线建议增到400。采样点之间用直线连接因为采样密度足够时视觉上就是光滑曲线。鼠标事件上点击添加控制点、按住拖动控制点、右键删除控制点。拖动时只更新控制点坐标不重建节点向量除非用户勾选了“按控制点实时重设节点向量”——这个交互细节直接决定了拖动手感后面避坑部分会展开。4. 编译运行与界面操作从源码到一条能拖动的曲线4.1 编译环境与命令行构建运行环境要求Windows 10或更高版本Visual Studio 2022安装“NET 桌面开发”工作负载。打开BSplineLab.sln后直接按F5就能跑起来。如果没有装完整IDE也可以用命令行构建但需要先打开“开发者命令提示符”msbuild BSplineLab.sln /p:ConfigurationDebug /p:PlatformAny CPUDebug配置输出在bin\Debug目录下Release构建则用/p:ConfigurationRelease生成的exe可以单独复制到其他机器运行。第一次编译如果报缺少引用通常是因为KurveMath文件夹下的.vb文件没有包含进项目右键项目选择“添加现有项”补进来即可。4.2 界面操作要点界面布局分三块左侧是CurvePanel画布右侧是参数面板顶部是工具条。工具条上有两个互斥模式添加模式点击画布空白处新增控制点选择模式点击控制点后按住拖动右键删除当前点。参数面板里有三个核心控件次数TrackBar范围从1到5节点分布ComboBox提供clamped和chord两种模式采样数NumericUpDown控制曲线平滑度。建议上手顺序是先切到添加模式随意点四个点看到一条默认的二次B样条曲线出现然后切到选择模式拖动其中一个控制点观察曲线局部变化接着把次数从2调到3对比C1连续和C2连续的区别最后切换节点分布方式感受均匀节点与累积弦长节点的差异。4.3 参数选择和效果对比参数推荐值说明次数1调试用曲线退化为控制点折线次数2常用曲线平滑且对噪声不敏感次数3工程标准C2连续CAD最常见次数5谨慎容易出现振荡和数值不稳定clamped默认首尾节点重复曲线过首尾控制点chord非均匀数据节点距离按控制点连线长度分配采样数200~400越大曲线越平滑性能仍可接受次数和节点分布是相互影响的。次数太高时控制点数量必须足够多否则方程组欠定反算出来的控制点会剧烈摆动。采样数只影响显示精度不影响曲线数学定义所以调高采样数只是让曲线看起来更连接平滑不会改变真实曲线位置。这里有个经验实际项目里90%的情况用三次B样条加chord节点分布就够了。5. 避坑与常见问题排查运行这套源码前必须知道的5个细节5.1 曲线首尾没有经过控制点现象明明选了clamped模式曲线首尾却没有贴住第一个和最后一个控制点而是缩进去一小截。原因clamped模式的本质是节点向量首尾各重复degree加1个节点。如果重复度不够或者代码里只用0和1各加一次曲线首尾就不会经过控制点。这种错误在视觉上非常隐蔽因为偏差通常不大。解决打印节点向量数组检查前degree加1个值是否都是0后degree加1个值是否都是1。项目里的BuildChordKnots已经保证了这一点但如果你在二次开发时手工改节点向量这个检查必须保留。5.2 参数u等于1.0时数组越界现象程序运行到最后一段曲线时报IndexOutOfRangeException每次采样到最后一个点必崩。原因基函数定义里节点区间是左闭右开即u在[knots(i), knots(i1))内取1。当u正好等于最大节点值1.0时它不属于任何一个左闭右开区间FindSpan如果不做边界处理就会试图访问knots(n2)之类的越界下标。解决在FindSpan入口加特判u大于等于knots(n1)直接返回n。同时在采样循环里把最后一个采样值写成knots(n1)减去一个极小量比如1e-7从根源上避免u落在边界上。5.3 拖动控制点时曲线乱跳现象在画布上拖动一个控制点整个曲线像面条一样剧烈摆动松手后才稳定下来。原因这是交互设计问题。如果每次拖动都调用累积弦长重新生成节点向量那么控制点位置一变节点向量也跟着变等于每一帧都换了一套参数域。曲线点的密度分布全变了视觉上就像乱跳。解决默认情况下拖动只更新控制点坐标数组不重建节点向量。只有在增加或删除控制点时才重构节点向量。项目里把“重建节点”和“更新控制点”这两个操作拆成了两个方法改代码时一定不要图省事合并成一次调用。5.4 次数过高导致曲线震荡现象把degree调到6或7曲线开始像示波器一样上下摆动插值模式下甚至解不出控制点。原因高次B样条基函数的数值稳定性随次数指数下降舍入误差被放大。同时如果控制点数量比degree加1大不了多少方程组近似病态反算结果自然不可用。解决UI层限制次数最大为5并在插值模式里校验数据点数量必须大于degree加1否则弹提示。这个限制不是偷懒是工程上经过验证的安全阈值。5.5 画布上曲线上下颠倒现象数据点的Y坐标越大曲线反而画得越低整个图形像被翻转过。原因数学坐标系里Y轴向上而Windows窗体屏幕坐标系的Y轴向下。直接拿世界坐标点去GDI绘制自然上下颠倒。解决CurvePanel里统一走一个世界坐标转屏幕坐标的函数把所有点先变换再画。修改这个函数就能整体翻转、平移或缩放不要在Paint事件里到处散落坐标变换代码否则后续维护会很痛苦。提示如果遇到“无法找到类型或命名空间”的编译错误先检查KurveMath文件夹里的.vb文件有没有包含进项目文件列表。VB.NET项目默认只编译工程里显式列出的文件手动复制目录时很容易漏掉这是最常见的首次编译失败原因。6. 二次开发改造思路把算法层抽成类库并扩展到NURBS这套源码最大的改造价值在于算法层和UI层已经分离。我的建议是先把KurveMath四个类抽成独立类库项目目标框架选netstandard2.0这样WinForms、WPF、控制台甚至WebAPI都能引用。抽库时注意把BasisFunction里的递归改成迭代或加缓存否则服务端高频调用性能会翻车。第二步值得做的扩展是NURBS也就是给每个控制点加一个权重w。普通非均匀B样条没有权重曲线点计算公式是C(u)等于基函数加权控制点NURBS在此基础上多了一个分母分子是所有带权控制点之和分母是基函数与权重乘积之和。体积上只多了一次权重累加和一次除法但能力上多出了精确表示圆弧、椭圆等解析曲线的可能性。Public Function ComputeRationalPoint(controlPoints As PointF(), weights As Double(), degree As Integer, knots As Double(), u As Double) As PointF Dim pt As PointF ComputePoint(controlPoints, degree, knots, u) Dim w As Double 0.0 For j As Integer 0 To controlPoints.Length - 1 w BasisFunction.Basis(j, degree, u, knots) * weights(j) Next pt.X / w pt.Y / w Return pt End Function验证NURBS改造是否成功的方法很直接取一个圆弧截面输入5个控制点和对应权重生成的曲线在100个采样点上到圆心的距离误差应该低于0.1像素。误差超标就检查权重数组的归一化逻辑这是NURBS里最常见的问题来源。这套源码我后来反复改过多次最大的教训不是算法本身而是边界条件。从那以后我每次入手样条源码第一件事就是打印节点向量把首尾重复区间画成竖线对着看再跑一遍反算验证然后才碰UI。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PHP生成Excel:基于PhpSpreadsheet封装库实现xlsx导出详解

PHP生成Excel:基于PhpSpreadsheet封装库实现xlsx导出详解

简介:这是一份面向PHP初学者的Excel导出示例源码包,演示了通过PHPExcel或PhpSpreadsheet类库在服务端生成Excel文件的基础流程。资源解压后共2个文件,包括一个demo.php主程序和一个jpg图片文件,整个rar压缩包约30KB。demo.php中包…

2026/10/18 12:33:28 阅读更多 →
Python OpenCV实现金属锈蚀量化检测与HSV颜色空间分析

Python OpenCV实现金属锈蚀量化检测与HSV颜色空间分析

简介:这是一份面向材料科学实验人员与计算机视觉初学者的金属表面锈蚀检测实践代码包,基于Python实现轻量级图像处理算法,解决金属腐蚀程度量化评估难题。项目采用颜色空间分析技术对固定视角拍摄的金属样本图像进行锈斑区域分割与像素级统计…

2026/10/18 12:33:28 阅读更多 →
基于React+TypeScript+SVG的图表设计器架构设计与实现

基于React+TypeScript+SVG的图表设计器架构设计与实现

最近在推进一个跨平台系统的图形化展示需求,手头这套内部代号diagram-design的图表设计器项目,从第一行代码到核心链路跑通,前后折腾了接近两个月。中间踩过的坑、推翻过的方案,比我上一个纯后台项目加起来都多。这个项目没有用多…

2026/10/18 12:33:28 阅读更多 →

最新新闻

Java AI应用开发实战:框架停更后的技术选型与工程化路径

Java AI应用开发实战:框架停更后的技术选型与工程化路径

1. 一个框架停更引发的技术选型焦虑前几天在一个技术交流群里,有位做Java后端的兄弟抛出一个问题:“Spring AI Alibaba是不是停更了?我看仓库好久没动静了,Java搞AI这块是不是没戏了?”群里瞬间热闹起来,有…

2026/10/18 14:08:20 阅读更多 →
Python批量提取PDF表格到Excel:pdfplumber与pandas实战

Python批量提取PDF表格到Excel:pdfplumber与pandas实战

简介:这份资源面向需要批量处理PDF表格的Python学习者与办公自动化开发者,提供从PDF中一键提取表格并导出Excel的完整实例。包内共14个文件,以png截图、xlsx结果表、pdf样本、ipynb笔记本和py脚本为主,压缩包约18.34MB&#xff0c…

2026/10/18 14:08:20 阅读更多 →
Docker 常用命令速查

Docker 常用命令速查

Docker 常用命令速查 一、镜像(Image) # 搜索镜像 docker search nginx# 拉取镜像(不指定标签默认 latest) docker pull nginx docker pull nginx:1.25# 查看本地镜像 docker images docker image ls# 删除镜像 docker rmi nginx:…

2026/10/18 14:08:20 阅读更多 →
强化学习智能体 vs 大模型智能体:选型、落地与避坑指南

强化学习智能体 vs 大模型智能体:选型、落地与避坑指南

简介:由快手科技快意大模型知识增强研发负责人毛航宇分享的《强化学习(多)智能体 和 大语言模型(多)智能体》PDF,系统梳理了近十年强化学习智能体与LLM智能体的研究脉络,并沿Deep RL、Transformer-based RL、LLM-based AI Agent的演化路径选讲…

2026/10/18 14:08:20 阅读更多 →
Idea断点调试(debug)详解:从条件断点到远程调试的完整实践

Idea断点调试(debug)详解:从条件断点到远程调试的完整实践

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

2026/10/18 14:08:20 阅读更多 →
HTML/CSS智能补全:语义化编码与前端效率革命

HTML/CSS智能补全:语义化编码与前端效率革命

1. 这不是“快捷键教学”&#xff0c;而是前端效率革命的起点你有没有过这样的时刻&#xff1a;写HTML时&#xff0c;手在键盘上敲了十几遍<div class"container">&#xff0c;光是闭合标签就反复按了三次方向键&#xff1b;写CSS时&#xff0c;想加个margin: …

2026/10/18 14:07:20 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型&#xff08;GMM&#xff09;的语音识别系统&#xff0c;很多人第一反应就是一堆数学公式&#xff0c;觉得门槛很高。但如果你真的在MATLAB里把它落地跑通&#xff0c;会发现核心其实就是三件事&#xff1a;把声音变成特征向量&#xff0c;用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人&#xff0c;但落到具体操作上&#xff0c;无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程&#xff1a;对图像做反白、改调色板、彩色转灰度&#xff0c;最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →