参数曲面:把一条曲线拉成一整张面
全课题骨架:几何不是"画"出来的,是控制点 + 一条可以反复施加的规则算出来的 ——
而那条规则只做一件事:在两点之间取一点。
第 1 课把这条规则用在一排控制点上(曲线),第 2 课把它装到一个环上(细分)。
这一课问的是第三个问题:怎么从"一条线"直接得到"一整张面"?
答案只有一行 —— 两个方向各做一次第 1 课的事:先按列取点,得到一排新点;再对这一排取点。
四段路:把两个方向乘起来(22.1)→ 看清"面只在边界上听话"(22.2)→
给控制点加一个权重、把抛物线变成圆(22.3)→ 两个方向都加权重,得到一个精确的环面(22.4)。
★ 量出来才敢写的一件事:曲面上的点只受"整片"控制网影响,可四条边界曲线只受边界那一行/列影响 ——
扰一个内部点,四条边界的位移恰好是 0(实测 2.22e−16,浮点意义下就是没动)。
以及:画一个精确的 90° 圆弧,中间那个权重不是拍出来的,是 w = sin(α/2) —— 实测 0.707106781。
保真度:示意 · 等价重现 —— 张量积 / 有理求值都是纯算术
(页面现场跑的十条与离线定稿 q203.mjs 同口径),画面是本页自己的二维软件光栅
(正交投影 + 平面着色 + 线框),不是 GPU 或 DCC 的曲面渲染。
★ 本页只做矩形控制网上的张量积与有理二次 / 双二次:不含 B 样条与节点向量(那是"非均匀"那一半),
也不含裁剪与求交;22.3 的圆弧是同一页自己算的,不调用任何几何库。
本页的原理与四张数值表照常可读(画面只是把同一份控制网画出来)。
(脚本启动中…)
定点观察:(脚本启动中…)
本帧的读数
(脚本启动中…)
22.1 段 · 两条曲线乘起来,就是一张面
本段只增加一样东西:第二个参数(控制网从"一排"变成"一片";读者只动「探针 (u, v)」)。 保真度:示意 · 等价重现。一条曲线是一排控制点;一张面就一片控制点,排成若干行若干列。 求值只有一行念法:先按列取点(对每一行做一次第 1 课的"在两点之间取一点",得到那一行在 u 处的点), 于是一排新点;再对这一排取点(对 v 再做一次)。本页把行/列的对应钉死一次: 行 i 由 v 混合、列 j 由 u 混合 —— 固定 v 得到的曲线叫等参曲线。 ★ 这一段的账是"两条独立路线":可分式 de Casteljau(逐层取点)与直接张量积(Bernstein 双和) 不共用任何中间量,625 档扫下来最大差 5.44e−16。
surfEval 只有一行 —— 它把第 1 课那行规则用了两次。| u | v | 可分式 S(u,v) | 直接张量积 | 差 |
|---|
定点观察:① 拖「探针 u / v」两个滑块;② 看画面上从两条等参曲线上各走出来一个点、 汇到那个黄点的地方;③ 结论:面上任何一点都由"两次取点"得到 —— 先在一排点上取出中间点, 再在这些中间点之间取出最终点;把行当成列(i/j 与 u/v 对调)会得到另一张面,而不是同一张。
22.2 段 · 面只在边界上听话
本段只增加一样东西:把控制点分成"角 / 边 / 内部"三类(读者只动「探针」与三类控制点的注视点; w 仍为 1)。保真度:示意 · 等价重现。上一段会算面上的点了,可"这个面到底受哪些控制点管"还不清楚。 一张 3×3 的控制网里,9 个点并不是平等的:四个角点落在面的四个角上; 四条边上的中间点只落在某一条边界曲线的内部;正中间那个点一个边界都碰不到。 ★ 一句能拿笔验的话:四条边界曲线只由边界那一行 / 那一列控制点决定 —— 扰正中间的点(位移 0.692820),四条边界的位移恰好是 0(实测 2.22e−16)。
dist4 四行 ——
它就是"量四条边界"这件事本身。| 扰动哪个点 | v = 0 | v = 1 | u = 0 | u = 1 | 动几条 |
|---|
定点观察:① 在画面里看三个高亮位置(角点 / 边点 / 内部点,由段按钮下的读数指示); ② 看四条边界曲线里哪几条跟着变色;③ 结论:曲面上"受不受影响"不是靠距离近不近, 而是靠"在不在那一行那一列上" —— 正中间那个点离四条边界都不远,可它一条都管不到。
22.3 段 · 一个权重,把抛物线变成圆
本段只增加一样东西:每个控制点配一个权重 w(读者只动「权重 w」)。 保真度:示意 · 等价重现。前两段的面全是多项式的 —— 而多项式画不出圆: 这条有一手源里逐字的写法("A nondegenerate circular arc is not a polynomial parametric curve"), 本页也把它量了出来(把权重全取 1,同一个 90° 弧的最大半径偏离就有 6.07e−2)。 差在哪儿?给每个控制点配一个权重:分子是 Σ w·B·P,分母是 Σ w·B,最后除一下。 权重不是"比例",它是一个拉力:中间那个点的权重越大,曲线越被拽向它。 ★ 中间那个权重不是拍出来的:一手源给的闭式是 w = sin(α/2)(α 是控制多边形在中间点处的顶角)—— 本例 α = 90°,所以 w = sin45° = 0.707106781,代进去半径偏离 3.33e−16。 ★ 权重还决定这条曲线的类型:w < 1 椭圆、w = 1 抛物线、w > 1 双曲线(一手源原话), 本页用隐式判别式 B²−4AC 逐档量了出来。
1 / den 就是"有理"两个字的全部内容 ——
分母一出现,曲线就不再是多项式,于是它能弯成圆。| 档 | 点 或 判别式 | |P| − 1 或 残差 | 是哪条曲线 |
|---|
定点观察:① 拖「权重 w」,先停在 1(多项式),再拖到 √2/2; ② 看画面里那条三维曲线(齐次空间里的抛物线)与它投到 w = 1 平面上的影子; ③ 结论:抬高那一维之后曲线永远是"多项式"的(所以是抛物线),是"除回去"这一步把它变成了圆 —— 权重不改变分子上的形状,它改变的是"从哪儿看"。
22.4 段 · 两个方向都带权重,得到一个精确的环面
本段只增加一样东西:第二个方向也带上权重(读者只动「权重 w」;w 现在作用在扫掠方向)。
保真度:示意 · 等价重现。上一段只把一个方向变成了有理。要让整张面都精确,两个方向都得有理:
控制点仍是 3×3,权重取两套权重的外积(剖面那一套 × 扫掠那一套)。
于是整张面就是"一个精确圆弧 + 一个精确剖面"扫出来的东西 —— 一个精确的环面。
★ 判据不靠眼睛:环面有隐式方程 (|S|² + R² − r²)² = 4R²(x² + y²),
把面上 625 个点代进去,最大残差 3.55e−15(相对 4.87e−16,就是浮点零);
把扫掠方向的权重全改成 1(退回多项式),同一组点上的残差立刻涨到 4.52e−2 —— 那就不是环面了。
四条边界也都是精确圆弧(半径误差 ≤ 3.89e−16)。
1 / den ——
一个在每一行里,一个在最终一遍里;少了 oms[i] 那一传,第二层的权重就错了。| w(扫掠中间) | S(0.5, 0.5) | 隐式残差 | 是不是环面 |
|---|
定点观察:① 拖「权重 w」,从 1 拖到 √2/2,再拖到 0.6; ② 看画面里那四条高亮的边界圆弧与曲面整体的形状;③ 结论:只有 w = sin(α/2) 那一档, 整张面上的每一个点才真的落在环面上 —— 差一点点,曲面看着"差不多是个环",可它已经不是了 (残差从 1e−16 跳到 1e−1,差 15 个数量级,眼睛完全分不出来)。
本页用到的做法,出处在哪
- 张量积与可分式求值:UC Berkeley CS184/284A Homework 2("each row of n control points … define a Bezier curve parameterized by u … We then consider that P_i for all n rows define a Bezier curve parameterized by v")—— cs184.eecs.berkeley.edu; 次数 (n, m) 需要 (n+1)×(m+1) 个控制点也在同一页。
- 等参曲线 / 边界曲线 / 角点插值 / 凸包 / 仿射不变:Michigan Tech CS3621 Bézier Surfaces: Important Properties("any isoparametric curve with v fixed is a Bézier curve defined by a set of control points that can be computed from the equation of the surface"、"the boundary curve corresponding to u = 0 and u = 1 are Bézier curves defined by the 0-th row and the m-th row")—— pages.mtu.edu; 曲面切成四块子面片见 UBC Math 308 personal.math.ubc.ca。
- 有理 Bézier 的定义式与那个 90° 圆弧的例子("control points P₀=(1,0), P₁=(1,1), P₂=(0,1) and weights α₀=1, α₁=1/√2, α₂=1, which describes a quarter circle"):A. Ramanantoanina & K. Hormann, New shape control tools for rational Bézier curve design, CAGD 88 (2021), Example 1 —— mahenina0403.github.io;同一篇给出了"齐次抬高 + 投影"的表述。
- w = sin(α/2) 与"权重决定圆锥曲线类型"("(P1) … For w < 1, we obtain an ellipse; for w = 1, a parabola; and for w > 1, a hyperbola."、"(P4) … w = sin α/2"):G. Farin, Curvature Continuity and Offsets for Piecewise Conics, ACM TOG 8(2), 1989 —— dl.acm.org。
- 多项式曲线画不出圆:R. Eisele, Approximating Circular Arcs with Bézier Curves("An exact unit-circle parameterization would have to satisfy x(t)²+y(t)²=1 as a polynomial identity … A nondegenerate circular arc is not a polynomial parametric curve.")—— raw.org; Piegl & Tiller《The NURBS Book》§1.4 有逐步的系数证明(本页只取到俄译镜像,英文原文未逐字取得,如实标注)。
- 未归一化权重 (1, 1, 2) 与"投影"的说法:Piegl & Tiller《The NURBS Book》§1.4(本页实测两组权重给同一个圆, 不变量 w₁²/(w₀w₂) = 1/2);"rational" 指权重、"non-uniform" 指节点间距见 McNeel Rhino 文档。
保真度与不做的部分:本页的控制网、有理求值、隐式方程残差全部由本页自己的代码算出
(页面现场与离线定稿 q203.mjs 同口径),画面是本页的二维软件光栅(正交投影 + 平面着色),
不声称与任何 DCC / GPU 的曲面渲染逐位相同。本页不含 B 样条与节点向量、不含裁剪与求交、
不含三个方向以上的推广。
自检面板
等待脚本…