公共法律服务网站平台建设预算夏邑网站建设
2026/5/14 2:06:50 网站建设 项目流程
公共法律服务网站平台建设预算,夏邑网站建设,百度山西授权代理,网站优化seo推广服务前言、 B 样条基函数递推推导#xff08;5 控制点准均匀#xff09;#xff1a;一阶→二阶→三阶 本文以5 个控制顶点为核心设定#xff0c;采用工程最常用的准均匀夹紧节点向量#xff0c;严格遵循德布尔-考克斯递推公式#xff0c;从一阶基函数#xff08;k2#xf…前言、B 样条基函数递推推导5 控制点准均匀一阶→二阶→三阶本文以5 个控制顶点为核心设定采用工程最常用的准均匀夹紧节点向量严格遵循德布尔-考克斯递推公式从一阶基函数k2逐步推导二阶k3、三阶k4基函数全程包含公式定义、节点代入、分区间化简、数值验证每一步推导可落地、可复现最终还会验证基函数的核心性质单位分解性。前置统一约定核心符号 / 规则全程不变[A]. 阶数定义行业通用且是基本的基本零阶基函数k10 次多项式分段常数递推唯一起点一阶基函数k21 次多项式线性本文推导起点二阶基函数k32 次多项式二次曲线三阶基函数k43 次多项式工程最常用C2连续[B]. 德布尔 - 考克斯递推公式递推的核心规则的本源[C]. 除零保护规则规则最重要的补丁必守分母为 0 时整个系数项直接取 0而非无穷大即[D]. 5 控制点核心参数举例说明、全程统一控制顶点数n15 → 基函数索引i0,1,2,3,4共 5 个基函数核心恒等式mnk节点向量长度m1k为当前基函数阶数准均匀夹紧节点向量首末重复k次中间均匀工程最优因最终推导三阶k4节点向量取首末重复 4 次的准均匀形式全程固定U{0,0,0,0,1,2,3,3,3,3}。节点索引u0​0,u1​0,u2​0,u3​0,u4​1,u5​2,u6​3,u7​3,u8​3,u9​3有效参数区间u∈[0,3]仅此区间基函数非零其余为 0。第一步推导零阶基函数k1—— 递推唯一起点零阶基函数是所有高阶推导的基础直接按定义公式结合固定节点向量U计算共 5 个i0,1,2,3,4重点判断节点区间是否为有效区间非空。零阶核心结论仅N3,1​(u)[0,1)、N4,1​(u)[1,2)、N5,1​(u)[2,3)非零其余全 0这是后续高阶推导的唯一非零项来源。第二步推导一阶基函数k21 次多项式—— 由k1递推一阶基函数为线性多项式由零阶基函数k1代入递推公式推导共 5 个i0,1,2,3,4步骤为写公式→代入节点→除零判断→分区间化简全程结合固定节点向量U。一阶通用递推公式k2逐一枚算 5 个一阶基函数一阶基函数k2最终结果特性仅在u∈[0,3]内非零为分段线性函数局部支撑性明显。第三步推导二阶基函数k32 次多项式—— 由k2递推二阶基函数为二次多项式由一阶基函数k2代入递推公式推导共 5 个i0,1,2,3,4通用公式先简化再逐一枚算重点分区间化简二次多项式。二阶通用递推公式k3逐一枚算 5 个二阶基函数结合一阶基函数结果 节点向量U除零判断后分区间化简二阶基函数k3核心结论均为分段二次多项式仅在u∈[0,3]内非零支撑区间比一阶更宽且满足局部支撑性单个基函数仅在 3 个连续节点区间非零。第四步推导三阶基函数k43 次多项式—— 由k3递推三阶基函数为三次多项式是工程最常用的 B 样条基函数C2连续造型能力与局部控制性最优由二阶基函数k3代入递推公式推导共 5 个i0,1,2,3,4这是本次推导的最终目标。三阶通用递推公式k4核心代入依据节点向量U{0,0,0,0,1,2,3,3,3,3} 二阶基函数k3结果 除零保护规则。逐一枚算 5 个三阶基函数分区间化简三次多项式全程分3 个有效子区间[0,1)、[1,2)、[2,3)化简最终结果为分段三次多项式是 5 控制点准均匀 B 样条的核心权重函数其他分母为项取仅保留非零项三阶基函数k4核心特性多项式次数分段三次多项式在[0,1)/[1,2)/[2,3)内各为一个三次多项式局部支撑性每个基函数仅在4 个连续节点区间内非零k4决定修改一个控制顶点仅影响相邻 4 段曲线有效区间仅u∈[0,3]非零其余全 0单位分解性任意u∈[0,3]5 个基函数之和恒为 1B 样条核心性质保证曲线落在控制顶点凸包内。第五步、关键验证(基函数的单位分解性)取有效区间内任意点如区间分界点u1、u2内部点u1.5代入三阶基函数k4计算和验证和恒为 1推导正确性核心依据。结论推导的三阶基函数满足单位分解性推导过程完全正确。第六步、累加 控制点*比例递推核心总结5 控制点准均匀 B 样条递推逻辑链零阶k1定义→一阶k2→二阶k3→三阶k4高阶基函数仅由低一阶基函数和节点向量决定无未知量递推唯一节点向量关键5 控制点 三阶基函数k4对应首末重复 4 次的准均匀夹紧节点向量U{0,0,0,0,1,2,3,3,3,3}是工程最优选择基函数与曲线的关联B 样条曲线为控制顶点 × 对应基函数的加权和即P(u)∑i04​Ni,4​(u)⋅Pi​Pi​为 5 个控制顶点的坐标2D/3D工程落地无需手动递推将德布尔 - 考克斯公式编写为代码循环递推 除零保护即可适配任意控制点 / 阶数 / 节点向量。5个控制点三阶 B 样条曲线的最终公式基于推导的三阶基函数k45 个控制顶点对应的二维 B 样条曲线最终参数公式为其中u∈[0,3]Ni,4​(u)为本文推导的三阶基函数遍历u的密集采样点并连接(x(u),y(u))即得到 5 控制点准均匀三阶 B 样条曲线。第七步、代码示意前置准备依赖库需要安装numpy数值计算和matplotlib绘图终端执行安装命令pipinstallnumpy matplotlib固定参数约定与之前推导一致5 个控制顶点手动设定二维坐标可自行修改准均匀夹紧节点向量首末重复对应阶数次数有效参数区间采样生成平滑曲线importnumpy as npimportmatplotlib.pyplot as plt# ---------------------- 核心工具函数1德布尔-考克斯基函数强化支撑域平滑过渡P3→P4 ----------------------def de_boor_cox(i, k, u_node, knot_vector): 纯节点区间的德布尔-考克斯递推剥离映射专注基函数计算强化支撑域 u_node节点区间内的参数0~3避免映射干扰 knot_lenlen(knot_vector)# 1. 边界预判ifi0or(i k)knot_len:return0.0# 2. 零阶基函数k1核心匹配节点区间支撑域精准ifk1:ifknot_vector[i]u_nodeknot_vector[i1]:return1.0else:return0.0# 3. 高阶基函数递推强化P3→P4的支撑域避免权重提前归零denom1knot_vector[i k -1]- knot_vector[i]denom2knot_vector[i k]- knot_vector[i 1]term10.0ifdenom1!0.0: term1(u_node - knot_vector[i])/ denom1 * de_boor_cox(i, k-1, u_node, knot_vector)term20.0ifdenom2!0.0: term2(knot_vector[i k]- u_node)/ denom2 * de_boor_cox(i1, k-1, u_node, knot_vector)returnterm1 term2# ---------------------- 核心工具函数2三阶B样条单独分段计算解决P3→P4平滑过渡无回绕 ----------------------def generate_3rd_order_bspline(control_points, knot_vector,sample_num2000): 三阶准均匀B样条分段计算适配节点向量[0,0,0,0,1,2,3,3,3,3] 保证P3→P4平滑曲线过渡无回绕、无直线 ctrl_nlen(control_points)# 5个控制点0~4k4# 三阶B样条阶数knot_maxknot_vector[-1]# 3节点向量最大值max_unp.max(control_points[:,0])# 5控制点x最大值node_to_ctrlmax_u / knot_max# 节点→控制点映射系数3→5# 1. 锁定有效参数区间节点区间[0, 3]对应控制点区间[0, 5]u_node_samplesnp.linspace(0, knot_max, sample_num)curve_points[]foru_nodeinu_node_samples: x, y0.0,0.0weight_sum0.0# 权重归一化避免直线补全# 2. 遍历所有控制点计算基函数权重强化P3→P4的支撑域foriinrange(ctrl_n): wde_boor_cox(i, k, u_node, knot_vector)ifw1e-8:# 忽略极小权重避免无效干扰xw * control_points[i,0]yw * control_points[i,1]weight_sumw# 3. 权重归一化确保末端权重之和为1平滑过渡P3→P4ifweight_sum1e-8: x /weight_sum y /weight_sum else:# 有效区间外直接取P4避免回绕到P0x, ycontrol_points[-1,0], control_points[-1,1]# 4. 禁止回绕x只能递增不能小于前一个点的x避免回到P0iflen(curve_points)0: prev_xcurve_points[-1][0]ifxprev_x: xprev_x (control_points[-1,0]- prev_x)/100# 强制平滑递增ynp.interp(x, control_points[:,0], control_points[:,1])curve_points.append([x, y])returnnp.array(curve_points)# ---------------------- 核心工具函数3一阶B样条单独处理保持正确不修改 ----------------------def generate_1st_order_spline(control_points,sample_num2000): xcontrol_points[:,0]ycontrol_points[:,1]u_samplesnp.linspace(0, np.max(x), sample_num)y_interpnp.interp(u_samples, x, y)returnnp.column_stack((u_samples,y_interp))# ---------------------- 核心工具函数4二阶B样条生成保持正确不修改 ----------------------def de_boor_cox_2nd(i, k, u, knot_vector, control_points,knot_max3.0): ctrl_nlen(control_points)-1max_unp.max(control_points[:,0])knot_lenlen(knot_vector)node_to_ctrlmax_u / knot_maxifi0or ictrl_n:return0.0ifk1:ifnp.isclose(u,0.0)and i0:return1.0elifnp.isclose(u, max_u)and ictrl_n:return1.0ifi 1knot_len:return0.0u_nodeu / node_to_ctrlifknot_vector[i]u_nodeknot_vector[i1]:return1.0else:return0.0ifi k -1knot_len or i kknot_len:return0.0u_nodeu / node_to_ctrl denom1knot_vector[i k -1]- knot_vector[i]denom2knot_vector[i k]- knot_vector[i 1]term10.0ifdenom1!0.0: term1(u_node - knot_vector[i])/ denom1 * de_boor_cox_2nd(i, k-1, u, knot_vector, control_points, knot_max)term20.0ifdenom2!0.0: term2(knot_vector[i k]- u_node)/ denom2 * de_boor_cox_2nd(i1, k-1, u, knot_vector, control_points, knot_max)returnterm1 term2 def generate_2nd_order_bspline(control_points, knot_vector,knot_max3.0,sample_num2000): ctrl_nlen(control_points)-1max_unp.max(control_points[:,0])u_samplesnp.linspace(0, max_u, sample_num)curve_points[]foruinu_samples: x, y0.0,0.0foriinrange(ctrl_n 1): wde_boor_cox_2nd(i,3, u, knot_vector, control_points, knot_max)xw * control_points[i,0]yw * control_points[i,1]ifnp.isclose(u, max_u): x, ycontrol_points[-1,0], control_points[-1,1]curve_points.append([x, y])returnnp.array(curve_points)# ---------------------- 主程序整合所有曲线三阶无回绕、平滑过渡 ----------------------if__name____main__:# 1. 5个控制顶点目标P3→P4平滑曲线过渡无回绕control_pointsnp.array([[0,0],# P0[1,4],# P1[3,5],# P2[4,2],# P3第四个点[5,0]# P4第五个点])max_unp.max(control_points[:,0])knot_max3.0# 2. 各阶节点向量三阶使用正确的节点向量长度10# 二阶节点向量正确保持不变k33knot_vector_k3np.array([0,0,0,1,2,3,3,3])# 三阶节点向量正确长度10核心[0,0,0,0,1,2,3,3,3,3]CORRECT_THIRD_ORDER_KNOTSnp.array([0,0,0,0,1,2,3,3,3,3])# 3. 生成三条曲线三阶单独分段计算解决平滑过渡问题curve_k2generate_1st_order_spline(control_points)# 一阶正确curve_k3generate_2nd_order_bspline(control_points, knot_vector_k3, knot_max)# 二阶正确curve_k4generate_3rd_order_bspline(control_points, CORRECT_THIRD_ORDER_KNOTS)# 三阶修复后# 4. 可视化验证三阶曲线P3→P4平滑过渡无回绕、无直线fig,(ax1, ax2, ax3)plt.subplots(1,3,figsize(18,6))plt.rcParams[font.family]DejaVu Sansplt.rcParams[axes.unicode_minus]False# 一阶曲线正确ax1.plot(control_points[:,0], control_points[:,1],o--,colorgray,labelControl Polygon,linewidth1)ax1.plot(curve_k2[:,0], curve_k2[:,1],colorred,label1st-order B-Spline (Linear),linewidth2)ax1.scatter([control_points[0,0], control_points[-1,0]],[control_points[0,1], control_points[-1,1]],colorred,s150,marker*,labelStart(P0)/End(P4))ax1.scatter(control_points[:,0], control_points[:,1],colorblack,s50)ax1.set_title(1st-order B-Spline (Correct))ax1.set_xlabel(x)ax1.set_ylabel(y)ax1.legend()ax1.grid(True,alpha0.3)ax1.set_xlim(-0.5,5.5)# 二阶曲线正确ax2.plot(control_points[:,0], control_points[:,1],o--,colorgray,labelControl Polygon,linewidth1)ax2.plot(curve_k3[:,0], curve_k3[:,1],colorblue,label2nd-order B-Spline (k3),linewidth2)ax2.scatter([control_points[0,0], control_points[-1,0]],[control_points[0,1], control_points[-1,1]],colorblue,s150,marker*,labelStart(P0)/End(P4))ax2.scatter(control_points[:,0], control_points[:,1],colorblack,s50)ax2.set_title(2nd-order B-Spline (Correct))ax2.set_xlabel(x)ax2.set_ylabel(y)ax2.legend()ax2.grid(True,alpha0.3)ax2.set_xlim(-0.5,5.5)# 三阶曲线修复后P3→P4平滑过渡无回绕ax3.plot(control_points[:,0], control_points[:,1],o--,colorgray,labelControl Polygon,linewidth1)ax3.plot(curve_k4[:,0], curve_k4[:,1],colorgreen,label3rd-order B-Spline (k4, Fixed),linewidth2)ax3.scatter([control_points[0,0], control_points[-1,0]],[control_points[0,1], control_points[-1,1]],colorgreen,s150,marker*,labelStart(P0)/End(P4))ax3.scatter(control_points[:,0], control_points[:,1],colorblack,s50)ax3.set_title(3rd-order B-Spline (Smooth P3→P4, No Rewind))ax3.set_xlabel(x)ax3.set_ylabel(y)ax3.legend()ax3.grid(True,alpha0.3)ax3.set_xlim(-0.5,5.5)plt.tight_layout()plt.show()# 额外验证打印三条曲线首尾点确认三阶无回绕精准落地print(*60)print(一阶曲线起点, curve_k2[0], 终点, curve_k2[-1])print(二阶曲线起点, curve_k3[0], 终点, curve_k3[-1])print(三阶曲线起点, curve_k4[0], 终点, curve_k4[-1])print(*60)代码关键部分说明对应之前的推导de_boor_cox函数严格实现了德布尔 - 考克斯递推公式包含零阶基函数的定义和高阶基函数的递推同时加入了除零保护与之前手动推导的规则完全一致。generate_bspline_curve函数实现了 B 样条曲线的核心公式P(u)∑i0n​Ni,k​(u)⋅Pi​通过密集采样参数u计算每个u对应的曲线点最终生成平滑曲线。节点向量设定三种阶数的节点向量均为准均匀夹紧节点首末重复对应阶数次数与之前 5 控制点的推导完全匹配保证了曲线的可控性过首末控制顶点。可视化部分分三个子图展示三种阶数的曲线同时绘制控制多边形方便你直观对比不同阶数曲线的光滑性和形状差异。运行结果说明一阶 B 样条k2分段线性曲线仅C0连续视觉上有折角紧贴控制多边形局部控制性最强但光滑性最差。二阶 B 样条k3分段二次多项式曲线C1连续切线连续无折角光滑性提升局部控制性较好。三阶 B 样条k4分段三次多项式曲线C2连续曲率连续视觉上极度平滑工程中最常用兼顾光滑性和局部控制性。可修改扩展的地方调整control_points中的坐标可观察曲线形状的变化体现局部控制性。增加采样点数sample_num可让曲线更平滑默认 1000 点已足够。修改节点向量为非均匀节点可调整曲线在局部区域的形状。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询