ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Penrose walk-on-spheres 示例包解析:用三语言(Domain/Style/Substance)绘制蒙特卡洛几何处理示意图

Penrose walk-on-spheres 示例包解析:用三语言(Domain/Style/Substance)绘制蒙特卡洛几何处理示意图 开发工具数据可视化【免费下载链接】penroseCreate beautiful diagrams just by typing notation in plain text.项目地址https://gitcode.com/gh_mirrors/pe/penrose点击查看免费下载导读本文围绕 Penrose 仓库中 packages/examples/src/walk-on-spheres/README.md 所描述的示例包展开讲解如何用 Penrose 的 Domain / Style / Substance 三语言体系精确复刻 Sawhney CraneSIGGRAPH 2020与 Sawhney、Seyb、Jarosz、CraneSIGGRAPH 2022两篇论文中 walk on spheresWoS球面游走 算法的插图风格。读完本文你将掌握该示例包的领域建模方式、样式定制入口、四个内置 Substance 程序Laplace / Poisson / Nested / OffCenter的写法以及如何通过 trio 配置与 registry 在浏览器中一键复现这些示意图并能基于源码自行扩展为 walk on rectangles 等变体。背景WoS 算法示意图要画什么Walk on spheres 是一种无网格蒙特卡洛求解 PDE 的方法从域内一点出发反复在当前点周围取一个与边界相切的最大球 → 在球面上随机采样下一个点 → 以该点为球心继续取球直到到达边界再沿游走路径估计边界积分。因此这类示意图的核心元素是一个二维求解域 Ω、一串逐级收缩的球、球面上的采样点、球心点以及连接相邻步的游走线段。真实算法中不同步的球往往大幅重叠虽然重叠如实反映了算法行为却会让随机生成的图难以阅读。本包在 registry 中为每个图配置了重叠较少的variation字符串README 同时指出一个待改进方向可以再添加一些ensure/encourage语句来进一步抑制球间重叠见 README。三语言包结构总览该示例包位于 packages/examples/src/walk-on-spheres由三类文件组成语言文件职责Domainwalk-on-spheres.domain声明域、点、球、嵌套点、射线等类型与谓词/构造函数Stylewalk-on-spheres.style定义布局阶段、配色、形状绘制与约束SubstanceLaplace.substance、Poisson.substance、Nested.substance、OffCenter.substance描述具体游走实例配套资源还包括球体明暗纹理 ball-shading.svg注意 README 中写作ball.svg实际文件名为ball-shading.svg、四个 trio 配置laplace-estimator.trio.json 等以及一个run脚本内容为npx roger watch $(PWD)可用 roger 实时观察构图。此外还附带 walk-on-starsWoS 的 Neumann 边界变体与 SignedAngle 等额外示例WalkOnStars.substance、geometry-2d.domain、SignedAngle.style等。Domain为游走建模walk-on-spheres.domain 是整个包的类型系统其设计直接对应 WoS 算法概念type Domain——求解域 Ωℝⁿ 中的区域附带hasMixedBoundaryConditions标记 Dirichlet/Neumann 混合边界与hasLegend是否绘制图例两个谓词type Point与isSourceSample——游走中的步点isSourceSample标记仅用于估计源项 f 的积分采样点如 Poisson 方程中的 y这些点不会作为新游走的起点type Subdomain及其子类Ball、Star——分别对应 WoS 的球与 walk-on-stars 的星形区域构造函数sampleBoundary( S )、sampleInterior( S )——表达这一步是从球面边界采样还是从球内部采样这正是 README 所说的用采样来源描述游走步ballAround( p )、starAround( p )——从当前点构造包围球/星isOffCenter( B )——标记偏中心游走默认假定球心即步点位置即 on-centertype NestedPoint及startWalkFrom( S )、nestedBallAround( p )、sampleBoundaryNested( S )——刻画游走中的游走WoS 的递归调用type Ray与toBoundary( p, S )、headOf( r )——用于星形区域中绘制到边界的射线。默认情况下本包假设 on-center 游走步点位于球心需要偏中心时在 Substance 中用isOffCenter标注即可。Style复刻论文插图的视觉语言walk-on-spheres.style 是视觉风格的核心它复刻了上述两篇论文的插图观感且易于定制。布局阶段与画布文件开头定义layout [ walkStage, nestStage, labelStage, legendStage ]将主游走、嵌套游走、标签、图例分别放进独立优化阶段避免相互干扰。画布默认 200×200 px注释注明等价于 150ptpx 与 pt 的换算常数toPt 96/72定义在Global块中。全局颜色与常量Colors与Global块集中管理复用样式是定制外观的首选入口常量默认值含义Colors.black / whitergba(0,0,0,1)/rgba(1,1,1,1)基础黑白Colors.darkGray / lightGray#b3b3b3/#e5e5e5域轮廓与域填充Colors.deepGreen#93c697子域标签配色Global.labelFont / labelSizeLinux Libertine/13.333px≈10pt标签字体Global.ballColor / sphereColor半透明绿 / 深绿球体填充与描边Global.subdomainOpacity.35球体透明度Global.walkColor#0066004c游走连线颜色设为none()可隐藏Global.shrinkFactor定义于 Ball 块.55相邻两步球半径收缩因子域与混合边界的画法forall Domain D块把 Ω 画成六边形顶点用maxPerturbation * diskRandom()做随机扰动使每次生成的域形状略有变化注释特别说明若把域换成椭圆或矩形后续逻辑应该依然成立因为球的半径统一由signedDistance( D.geometry, B.center )计算——但要注意并非所有形状如任意 Bézier 曲线都支持 signed distance。当hasMixedBoundaryConditions(D)为真时style 用四条 Polyline 拼出边界Dirichlet 边为实线圆头描边Neumann 边为2.66,2.66虚线并分别归入dirichletBoundary/neumannBoundary两个 Group 控制图层顺序。球的绘制半径即算法本身forall Ball B; Domain D块是整个 style 中最贴合算法的一处scalar B.radius -signedDistance( D.geometry, B.center ) - Global.sphereStrokeWidth/2 - Global.domainStrokeWidth/2.球半径取球心到域边界的负符号距离——这正是 WoS 中最大相切球的定义再减去一半描边宽度让球与域边界在视觉上精确相切。随后用Circle绘制半透明着色球并在其上叠加Image形状引用 ball-shading.svg 做明暗纹理不同游走类型再叠一层半透明圆盘来区分颜色。README 明确提示更大幅度的定制例如把球改成矩形以绘制 walk on rectangles 算法可从替换这些形状入手。连续两步球的处理集中在where x1 : sampleBoundary( B0 ); B0 : ballAround( x0 ); B1 : ballAround( x1 )规则中ensure equal( B1.radius, B1.shrinkFactor * B0.radius )——后一步球按shrinkFactor收缩WoS 中常见但并不总是如此layer B1.ball above B0.ball——小球画在大球之上便于观察标签相邻点之间画Line线段walkColor半透明绿并借助above/below图层规则表达游走方向。偏中心游走的视觉约束isOffCenter(B)规则不再把球心直接复制为点位置而是让布局引擎决定B.center同时用scalar r B.radius * random(.25,.75) ensure norm(B.center - p.location) r in walkStage把点限制在球内 25%–75% 的半径环带避免小球的点太贴近边界难以辨认。采样点的三种画法sampleBoundaryensure equal( norm(p.location - B.center), B.radius )点精确落在球面 ∂B 上sampleInteriorscalar r B.radius * random(.2,.8)点落在距球心 20%–80% 处避免撞上球心或边界isSourceSample源项采样点改为白底黑边的空心大点r2与游走步点明显区分。嵌套游走NestedNestedPoint与nestedBallAround对应的样式块把嵌套球改为更白、更不透明的观感B.ball的填充与描边设为none()B.shading换成白色半透明圆rgba(1,1,1,.2)填充、rgba(1,1,1,.5)描边并覆盖shrinkFactor .7。嵌套游走的起点由vec2 y closestPoint( D.geometry, B0.center ) scalar u .75 override p.location (1-u)*B0.center u*y确定取外层球心到域边界的最近点插值 75% 作为嵌套游走的起点。嵌套步同样执行球面约束与收缩约束只是阶段换到nestStage并用白色连线区分主游走。README 指出isNested谓词可用于高亮属于 WoS 递归调用walk within a walk的步。图例Legend当hasLegend(D)且hasMixedBoundaryConditions(D)时style 在legendStage绘制一个Rectangle图例框内含两条虚线样例Dirichlet 实线 vs Neumann 虚线及对应文字并通过ensure contains(...)保证内容落在框内。可作为模板的注释块style 文件末尾第 820–1085 行以注释形式保留了多个派生模板是扩展本包的最佳起点WalkOnStars.style加宽画布容纳图例、偏移域、固定起点walk-on-spheres-no-subdomains.style隐藏所有球与采样点、把游走轨迹调得更透明、删除域标签避让子域的约束改为避让游走线StarShapedRadii.style为星形区域绘制最小 Dirichlet 相切球与最小 Neumann 轮廓球两个widgetdirichletBall/neumannBall红/蓝描边并标注d_{\text{Dirichlet}}与d_{\text{silhouette}}StarShapedRegion.style均匀分布toBoundary射线直至星形区域边界alternate-domain.style把域替换为 17 边形并重设四段边界的顶点。Substance四个开箱即用的实例README 中四个.substance文件分别演示了不同估计器的画法全部可以在浏览器端通过 registry 复现见下文如何运行。Laplace 估计器Laplace.substance演示纯 Dirichlet 边界条件下 Laplace 方程 Δu 0 的 WoS 估计Domain U Point x0 Ball B0 : ballAround( x0 ) Point x1 : sampleBoundary( B0 ) Ball B1 : ballAround( x1 ) Point x2 : sampleBoundary( B1 ) Ball B2 : ballAround( x2 ) Point x3 : sampleBoundary( B2 ) Ball B3 : ballAround( x3 ) Point x4 : sampleBoundary( B3 ) Ball B4 : ballAround( x4 ) Label U $\Omega$ Label x0 $x_0$ Label x1 $x_1$ Label x2 $x_2$ Label x3 $\ldots$ Label x4 $x_k$每一轮都是球心取点 → 球面采样 → 围绕新点再取球的标准游走链标签使用 TeX 语法$x_0$、$\ldots$、$x_k$。对应渲染效果见 wos-laplace-estimator-walk-on-spheres.svg。Poisson 估计器Poisson.substance演示 Δu f 的估计每步除边界采样x_i外还从球内部采样源项点y_i并标注isSourceSamplePoint x0 Ball B0 : ballAround( x0 ) Point y0 : sampleInterior( B0 ) isSourceSample( y0 ) Point x1 : sampleBoundary( B0 ) ...这类y点只用于积分估计、不会再起新球因此 style 用白点样式区分。对应效果见 wos-poisson-estimator-walk-on-spheres.svg。Nested 估计器Nested.substance演示双调和方程 Δ²u 0 这类需要游走中的游走的情形主游走x、B之外从主游走第 0 步、第 1 步的球内分别派生两条嵌套游走NestedPoint y00 : startWalkFrom( B0 ) Ball B00 : nestedBallAround( y00 ) NestedPoint y01 : sampleBoundaryNested( B00 ) Ball B01 : nestedBallAround( y01 ) ... NestedPoint y10 : startWalkFrom( B1 ) Ball B10 : nestedBallAround( y10 ) ...对应效果见 wos-nested-estimator-walk-on-spheres.svg。OffCenter 估计器OffCenter.substance与 Laplace 相同的基础游走链但给每个球加上isOffCenter( B0 ) ... isOffCenter( B3 )让步点偏离球心用于展示偏中心游走的示意图。对应效果见 wos-offcenter-estimator-walk-on-spheres.svg。如何运行与复现每个实例都由 trio 配置绑定三语言文件例如 laplace-estimator.trio.json{ substance: ./Laplace.substance, style: [./walk-on-spheres.style], domain: ./walk-on-spheres.domain, variation: LilyDunlin3394 }其中variation就是 README 提到的、用于固定随机种子的字符串——同一 variation 总能得到重叠较少的同一布局。四个实例在 registry.json 中的登记情况为注册键展示名gallerywalk-on-spheres/laplace-estimatorWalk on Spheres - Laplace Estimatortruewalk-on-spheres/poisson-estimatorWalk on Spheres - Poisson Estimatorfalsewalk-on-spheres/nested-estimatorWalk on Spheres - Nested Estimatorfalsewalk-on-spheres/offcenter-estimatorWalk on Spheres - Off-Center Estimatorfalse运行方式有两种watch 模式在该目录执行npx roger watch $(PWD)即 run 脚本内容可实时观察/迭代某一 trio 的构图效果浏览器画廊laplace-estimator已开启gallery: true会出现在官方示例画廊中其余三个可在 registry 中手动切换gallery或在本地运行 examples 包时按 key 加载。扩展建议基于源码可以明确给出的扩展方向减少球重叠在 walk-on-spheres.style 中为相邻球增加ensure disjoint(B0.ball, B1.ball)之类的约束README 明示这是本包的改进方向换算法形状仿照Circle块把球替换为Rectangle即可绘制 walk on rectangles 变体换域形状参考末尾注释的alternate-domain.style用 17 边形替代默认六边形Neumann 边界hasMixedBoundaryConditionsStar/Ray相关块含closestSilhouetteDistance、rayIntersectDistance等几何函数已支撑 walk-on-stars可直接参考 walk-on-stars.trio.json 与WalkOnStars.substance扩展。标签绘制上当前使用Equation形状经 MathJax 排版 TeX支持漂亮的字体轮廓README 注明若改用Text形状可获得更好的字体与描边特性但失去 TeX 排版能力——注意 README 的表述顺序与 style 实际代码相反代码默认Equation以源码为准。小结walk-on-spheres 示例包是 Penrose用 DSL 复刻论文插图的典型范例Domain 层把 WoS 算法步骤抽象为类型与构造函数Style 层用符号距离与图层约束精确还原算法的几何直觉Substance 层则用短短十几行描述一条完整游走。无论是想复现这两篇 SIGGRAPH 论文的图还是想把它改造成自己的蒙特卡洛算法插图工具都可以从本包出发快速上手。赞分享开发工具数据可视化【免费下载链接】penroseCreate beautiful diagrams just by typing notation in plain text.项目地址https://gitcode.com/gh_mirrors/pe/penrose点击查看免费下载相关推荐Penrose 光线追踪示例包用 Domain、Style、Substance 三语言绘制渲染与光传输算法示意图Penrose 光线追踪示例包用 Domain、Style、Substance 三语言绘制渲染与光传输算法示意图 导读 Penrose 的核心愿景是“用纯文本开发工具数据可视化Penrose 实战指南用 Domain–Substance–Style 三语言纯文本绘制集合论欧拉图Penrose 实战指南用 Domain–Substance–Style 三语言纯文本绘制集合论欧拉图 Penrose 是一个只靠纯文本符号就能生成高质量图开发工具数据可视化Penrose 入门实战用 .domain / .substance / .style 三件套绘制集合示意图教程一 4 道挑战完整题解Penrose 入门实战用 .domain / .substance / .style 三件套绘制集合示意图教程一 4 道挑战完整题解 导读本文以 Pe开发工具数据可视化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表