ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Penrose 矩阵库端到端回归测试深度解析:从 Mathematica 参考解到红绿像素比对

2026/9/27 21:25:49 拓冰建站 浏览量
Penrose 矩阵库端到端回归测试深度解析:从 Mathematica 参考解到红绿像素比对 开发工具数据可视化【免费下载链接】penroseCreate beautiful diagrams just by typing notation in plain text.项目地址https://gitcode.com/gh_mirrors/pe/penrose点击查看免费下载本指南围绕 Penrose 仓库中 matrix-library 目录的完整设计与实现展开讲解矩阵函数库涵盖 2D/3D 空间变换与摄像机投影矩阵如何通过参考解 vs 计算解双图层绘制实现端到端回归验证。读完本文你将掌握该测试套件的数据组织方式、红/绿像素判定原理、抗锯齿容差配置以及如何在 Penrose 中利用矩阵库函数与齐次坐标写出可自动校验的 Style 程序。目录结构一组程序、一套矩阵测试基建matrix-library 目录以每个被测函数为单位组织 substance 程序配套统一的 domain/style/trio.json 描述其文件布局如下matrix-functions-2d.domain与matrix-functions-3d.domain声明被测谓词每个矩阵函数对应一个谓词matrix-functions-2d.style与matrix-functions-3d.style实现全部 2D / 3D 测试的绘制逻辑每个函数一个.substance文件如rotate3d.substance与对应的.trio.json如 rotate3d.trio.jsonReference2D.nb与Reference3D.nbMathematica 笔记本用于生成参考解的坐标数值test-example.svgREADME 中用于演示测试通过/失败视觉效果的示例图。以 rotate3d.trio.json 为例每个用例通过 trio 文件把三个程序绑定在一起并使用variation: Deterministic确保渲染结果可复现{ substance: ./rotate3d.substance, style: [./matrix-functions-3d.style], domain: ./matrix-functions-3d.domain, variation: Deterministic }对应的 substance 程序极为精简——它只需要声明一个形状并触发对应谓词Shape S rotate3d(S)而 matrix-functions-3d.domain 中为 12 个 3D 矩阵函数各声明了一个谓词identity3d、diagonal3d、inverse3d、outerProduct3d、crossProductMatrix、rotate3d、rotate3dh、scale3d、shear3d、translate3dh、matrix3d等matrix-functions-2d.domain 则对应声明了 11 个 2D 谓词。这些用例全部登记在 registry.json 中可以被示例浏览与测试基础设施统一发现。测试原理参考解画红、计算解画绿matrix-library 是一组端到端回归测试每个用例同时绘制两个版本的结果——参考解reference由外部权威工具Mathematica预先算好的坐标绘制为红色计算解computed运行 Penrose 矩阵库函数实时算出的坐标绘制为绿色。由于画布背景也是绿色因此整张图全绿即代表计算解与参考解完全吻合测试通过只要有任何一块红色残留就说明 Penrose 计算与参考解存在偏差测试失败。为了直观显示确实画了东西而非一片纯色计算解被刻意渲染为比背景更深一号的绿色#0e0背景为#0f0。README 用一张对比图演示了这一判定逻辑左旋转角度正确、全图变绿右使用错误角度、红色残留2D 测试的具体实现2D 测试使用一个3-4-5 直角三角形作为测试形状顶点(-15,-20)、(15,-20)、(-15,20)。选择这个形状的关键考量在 matrix-functions-2d.style 的注释中写得很清楚直角三角形没有任何欧几里得对称性无法通过旋转、反射、平移映射到自身因此计算解恰好撞上参考解的假阳性概率极低。forall Shape S { list S.points [ (-15,-20), (15,-20), (-15,20) ] shape S.reference Polygon { points: S.points fillColor: #f00 strokeColor: none() strokeWidth: 0 ensureOnCanvas: false } layer S.reference above canvas.background shape S.computed Polygon { points: S.points fillColor: #0e0 strokeColor: #0f0 strokeWidth: global.tolerance ensureOnCanvas: false } layer S.computed above S.reference }其中global.tolerance是 style 文件开头 定义的容差参数scalar tolerance 0.25。注释说明由于栅格化效应如抗锯齿即使坐标完全相同的两个形状只要颜色不同边界处仍可能产生fringe边缘杂色因此用容差给计算解画一圈比参考解稍宽的描边strokeWidth: global.tolerance把栅格化误差包进绿色区域。随后每个 2D 谓词对应一段forall ... where ...规则典型的模式是forall Shape S where rotate2d(S) { scalar θ 1.3*MathPI() mat3x3 A rotate2d(θ) override S.computed.points matrixMultiplyList( A, S.points ) override S.reference.points [(-7.36356,23.891),(-24.9971,-0.37955),(24.9971,0.37955)] }即用 Penrose 矩阵库函数构造矩阵A用matrixMultiplyList把A作用到形状顶点上得到计算解参考解则直接硬编码 Mathematica 算出的坐标列表。涉及仿射变换如rotate、translate2d的用例还需借助齐次坐标forall Shape S where translate2d(S) { mat3x3 A translate(12.34, -23.21) override S.computed.points fromHomogeneousList( matrixMultiplyList( A, toHomogeneousList(S.points) )) override S.reference.points [(-2.66,-43.21),(27.34,-43.21),(-2.66,-3.21)] }toHomogeneousList把笛卡尔坐标升维为齐次坐标矩阵乘法后在fromHomogeneousList中除以齐次分量还原为笛卡尔坐标——这正是仿射变换平移无法用线性矩阵表达、必须用齐次矩阵的原因。3D 测试的具体实现3D 测试的形状是一个不对称四面体四个顶点[-15,-20,-25]、[15,-20,-25]、[-15,20,-25]、[-15,-20,25]同样出于无对称性、避免假阳性的考虑。由于 Penrose 画布是 2D 的matrix-functions-3d.style 先把每个顶点的 x、y 坐标提取出来S.c0…S.c3来自计算解、S.r0…S.r3来自参考解再分别用 6 条Polyline连出四面体的 6 条棱红绿两组棱分别聚合成Group形状并分层叠放forall Shape S { scalar width 4 -- line width list S.points [ [-15,-20,-25], [15,-20,-25], [-15, 20,-25], [-15,-20, 25] ] ... shape S.reference Group { shapes: [ S.reference0, S.reference1, S.reference2, S.reference3, S.reference4, S.reference5 ] } layer S.reference above canvas.background ... shape S.computed Group { shapes: [ S.computed0, S.computed1, S.computed2, S.computed3, S.computed4, S.computed5 ] } layer S.computed above S.reference }3D 用例同样逐谓词实现例如rotate3d使用 Rodrigues 旋转公式构造矩阵forall Shape S where rotate3d(S) { scalar θ 12.3 vec3 u (1, 1, 1)/sqrt(3) mat3x3 A rotate3d( θ, u ) override S.computedPoints matrixMultiplyList( A, S.points ) override S.referencePoints [(-14.4165,-21.5198,-24.0638),(14.8782,-25.7264,-19.1518),(-7.86714,17.5398,-29.6726),(-21.4275,-13.3331,24.7606)] }而rotate3dh与translate3dh这类齐次版本则沿用 2D 中升维—乘法—降维的写法forall Shape S where translate3dh(S) { mat3x3 A translate3dh( 12.3, -23.4, 4.32 ) override S.computedPoints fromHomogeneousList( matrixMultiplyList( A, toHomogeneousList( S.points ) )) override S.referencePoints [(-2.7,-43.4,-20.68),(27.3,-43.4,-20.68),(-2.7,-3.4,-20.68),(-2.7,-43.4,29.32)] }自动化判定把容差描边改回纯绿README 给出了把测试接入 CI 的关键技巧把 matrix-functions-2d.style 与 matrix-functions-3d.style 中计算解的深绿色#0e0改为#0f0与背景、容差描边同色此后所有像素应为100% 绿色0% 红、0% 蓝因此自动化测试只需检查栅格化 SVG 中是否存在任何偏离纯绿色的像素即可判定整组矩阵函数是否正确。换句话说测试的通过标准从人眼看不看得出红色变成了像素级全绿可以直接写成脚本来批量执行并断言。参考解如何生成Mathematica 笔记本所有参考坐标均由 Mathematica 生成思路是让每个被测函数对应一个 Mathematica 内建等价函数例如rotate3d对应RotationMatrix[]。Reference2D.nb 中给出了完整的生成过程核心模式如下定义测试形状的原始顶点points {{-15,-20},{15,-20},{-15,20}}对每个函数构造对应的 Mathematica 矩阵如DiagonalMatrix[{-0.8, 1.2}]对应diagonal2d、Inverse[...]对应inverse2d、RotationMatrix[θ]对应rotate2d用A . # / points把矩阵作用于每个顶点通过自定义的ToPointList辅助函数把结果格式化成语法树Style 程序可直接粘贴的坐标列表字符串例如diagonal2d的输出[(12.,-24.),(-12.,-24.),(12.,24.)]与 matrix-functions-2d.style 中的参考解完全一致。对于rotate这类绕指定中心旋转的用例Mathematica 侧实现的是先平移再旋转再平移回去的复合变换(A . (# - c)) c与 Penrose 端rotate(θ,x,y)的语义严格对应。Reference3D.nb采用同样的策略为 3D 用例生成数值如rotate3d中旋转轴(1,1,1)/sqrt(3)、crossProductMatrix中的向量(.9,-1.2,.7)等。被测函数全景README 明确了当前被测试的矩阵库函数清单库扩展时这些函数也应随之补充2D11 个函数说明依据 Functions.ts 中的实现identity2d2×2 单位矩阵identity的线性版本diagonal2d由对角向量构造对角矩阵diagonal(v)的 2D 应用inverse2d2×2 矩阵求逆outerProduct2d两个 2-向量外积得到 2×2 矩阵外积定义见 Functions.tsskew2d斜切变换矩阵为[[1, tan(ax)], [tan(ay), 1]]ay缺省为 0shear2d沿方向 u、按方向 v 上的分量剪切x ↦ x ⟨v,x⟩ utranslate2d平移经齐次坐标编码的仿射版本scale2d缩放rotate绕任意中心点旋转仿射版本rotate2d绕原点旋转matrix2d直接用字面量矩阵[[a,b],[c,d]]做线性变换3D11 个函数说明identity3d3×3 单位矩阵diagonal3d由对角向量构造 3×3 对角矩阵inverse3d3×3 矩阵求逆outerProduct3d两个 3-向量外积crossProductMatrix由 3-向量构造反对称矩阵使Au v × u定义见 Functions.tsrotate3d绕单位轴旋转用 Rodrigues 公式I sin(θ)v̂ (1−cos(θ))v̂²构造定义见 Functions.tsrotate3dhrotate3d的 4×4 齐次版本toHomogeneousMatrix(rotate3d(...))可与其他仿射变换复合定义见 Functions.tsscale3d缩放shear3d3D 剪切translate3dh3D 平移的 4×4 齐次版本定义见 Functions.tsmatrix3d3×3 字面量矩阵线性变换README 还特别说明为了控制测试规模一些辅助函数如把矩阵与向量列表相乘的matrixMultiplyList、齐次坐标转换的toHomogeneousList/fromHomogeneousList其定义分别见 Functions.ts、Functions.ts、Functions.ts不直接单独测试而是作为被测函数用例的组成部分被间接覆盖。从源码看矩阵库的底层语义深入 Functions.ts 可以看到这些测试所验证的正是矩阵库的公开 API。值得注意的实现细节包括rotate3d与rotate3dh的区分前者返回 3×3 线性矩阵无法直接与 3D 仿射变换复合后者先构造线性旋转再提升为 4×4 齐次矩阵因此可以参与平移等仿射复合——这正是 2D 侧rotate/rotate2d、skew/skew2d、shear/shear2d成对出现的同一设计思想translate3dh的矩阵形如[[1,0,0,x],[0,1,0,y],[0,0,0,z],[0,0,0,1]]可见平移这类仿射操作统一以齐次坐标承载crossProductMatrix返回的反对称矩阵同时是 Rodrigues 公式的组成部分测试中rotate3d的旋转轴向量正是用crossProductMatrix展开的数学对象两个函数在库内部互相印证。这些实现事实说明matrix-library 测试不仅验证数值正确性还隐式检验了矩阵库线性版本 vs 齐次仿射版本的 API 契约——一旦某个函数改变了矩阵维度约定或旋转方向约定红绿比对就会立刻暴露问题。如何运行与扩展这套测试运行方式上每个用例都可作为标准 trio 程序交给 Penrose 渲染器执行例如通过示例浏览基础设施加载 registry.json 中登记的matrix-library/rotate3d等条目渲染出的 SVG 即可直接用于红/绿像素检查。若要新增一个矩阵库函数建议遵循目录既有约定在matrix-functions-2d.domain或matrix-functions-3d.domain中声明对应谓词在对应 style 文件中仿照既有规则添加forall Shape S where predicate(S)块用库函数构造矩阵、matrixMultiplyList计算解并用 Mathematica可参照Reference2D.nb/Reference3D.nb的模式生成参考坐标新建一个仅含Shape S与谓词声明的.substance文件与对应.trio.json保持variation: Deterministic并在 registry.json 中登记需要接入自动化时把计算解颜色改为#0f0然后断言渲染结果不存在任何非纯绿像素。小结matrix-library 用一红一绿、全绿即通过的精巧设计把矩阵函数库的回归验证变成了一个可自动化的像素级断言问题无对称形状杜绝假阳性容差描边消化抗锯齿边缘误差Mathematica 参考解提供独立于实现的外部真值而齐次坐标工具链则让平移、旋转、缩放、剪切、投影等变换能够在统一的矩阵代数框架下被逐函数验证。这套模式同样适用于任何需要数值计算结果 vs 外部参考结果对拍验证的 Penrose 程序。赞分享开发工具数据可视化【免费下载链接】penroseCreate beautiful diagrams just by typing notation in plain text.项目地址https://gitcode.com/gh_mirrors/pe/penrose点击查看免费下载相关推荐GitHub Enterprise安全扫描github-dorks企业内部代码安全的终极解决方案GitHub Enterprise安全扫描github dorks企业内部代码安全的终极解决方案 GitHub Enterprise集成github dork网络安全CloudNativePG 端到端E2E测试体系解析从测试矩阵到本地复现CloudNativePG 端到端E2E测试体系解析从测试矩阵到本地复现 CloudNativePG 在每次代码提交后都会自动执行一套完整的 End to云原生数据库高可用灾备容器编排cli-anything-joplin 测试体系深度解析从 107 个纯单元测试到真实后端端到端回归cli anything joplin 测试体系深度解析从 107 个纯单元测试到真实后端端到端回归 cli anything joplin 是包裹真实 jo人工智能AI AgentAI 技能工具调用CLI上一篇终极教程使用globe绘制星巴克全球分布地图的完整步骤下一篇如何开启WechatRealFriends深色模式夜间使用体验与护眼效果完全评测创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考