ARTICLE DETAIL

资讯详情

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

Penrose Style 随机采样函数详解:常量化的随机值与可优化变量

Penrose Style 随机采样函数详解:常量化的随机值与可优化变量 开发工具数据可视化【免费下载链接】penroseCreate beautiful diagrams just by typing notation in plain text.项目地址https://gitcode.com/gh_mirrors/pe/penrose点击查看免费下载导读在 Penrose 的 Style 语言中random()、unitRandom()、sphereRandom()等以random结尾的函数用于在绘制阶段为标量、向量或颜色采样随机值是生成多样化图示如恐龙 3D 投影、分形混沌游戏、粒子云的核心工具。本文将完整梳理这些随机采样函数的用法与返回值语义深入讲解随机采样值行为等同常量、不可被优化器修改这一关键设计并给出可直接复制的 Style 代码示例与源码级实现依据帮助你精准控制图元的随机初始化与可优化自由度。随机采样值的本质行为等同常量Penrose 的 Style 语言把未知值?和随机采样值区分开来未知值?会在优化阶段被当作可调参数通过encourage/ensure等约束被不断调整而随机采样函数产生的值则在编译期一次性确定之后保持固定。scalar x random(0,100) encourage x 50上面这段 Style 代码中x是一个在[0,100)区间内随机采样的常数encourage x 50对x没有任何影响——优化器不会去移动它正如常量1.23无法被优化一样。随机常量参与优化向量追赶示例随机采样值本身不可优化但它可以参与构造其他可优化的量。文档给出了一个经典例子-- construct a vector v scalar L random(1,2) -- pick a random length between 1 and 2 scalar θ ? -- angle is unknown vec2 v L * ( cos(θ),sin(θ) ) -- try to get this vector to meet the point p encourage norm( v - p ) 0这里L长度是随机采样得到的固定常数θ角度是未知值?。优化器只能通过旋转向量来让v的终点逼近p而不能拉伸或缩短L。这正体现了核心设计原则随机采样值randomly-sampled values的行为等同常量。从源码实现看这一语义由 随机采样器模块 与 Style 编译器 共同保证simpleContext以variation即随机种子初始化seedrandomPRNG每次makeInput调用时通过采样器产生确定性的数值并立即包装为不可优化的ad.Var变量。随机采样函数全览执行随机采样的函数通常以random为后缀它们都返回一次采样、固定不变的值。下表汇总了 Style 参考文档 中列出的全部函数函数返回值采样分布返回类型random(minVal, maxVal)标量区间[minVal, maxVal)上的均匀分布RealunitRandom()标量区间[0,1)上的均匀分布RealnormalRandom()标量均值为 0、标准差为 1 的正态分布RealdiskRandom()二维点单位圆盘上的均匀分布RealN二维向量sphereRandom()三维点单位球面上的均匀分布RealN三维向量triangleRandom(a,b,c)二维点以a、b、c为顶点的三角形内的均匀分布RealN二维向量这些函数全部注册在核心库的 计算函数字典 中并带有完整的参数类型与描述信息可直接在 Style 表达式中调用。random(minVal, maxVal)区间均匀采样random( minVal, maxVal )从区间[minVal, maxVal)均匀采样一个随机标量包含左端点、不包含右端点。其实现见 random 定义要求minVal与maxVal必须是常量若传入计算值或可优化值会直接抛出错误Expects the minimum and maximum values to be constants. Got a computed or optimized value instead.因此random的参数本身不能依赖?或运算表达式。仓库中的真实用法可参考dinoshade.style用random(0,2) * MathPI()、15*random(-1,1)随机生成恐龙的朝向角与位移arc-mesh.style用random(-1,1) * MathPI()/4随机设定弯曲角ifs.style用多组random生成迭代函数系统的仿射变换参数。unitRandom()单位区间采样unitRandom()从[0,1)均匀采样一个随机标量见 unitRandom 定义等价于random(0,1)。它通常作为构造其他随机量的基础随机源。normalRandom()标准正态采样normalRandom()从均值为 0、标准差为 1 的正态分布中采样一个随机标量见 normalRandom 定义。其底层基于 Box–Muller 变换实现见 randn 实现const randn ({ makeInput }: Context): ad.Num { const u1 makeInput({ init: { tag: Sampled, sampler: uniform(0, 1) }, stages: new Set() }); const u2 makeInput({ init: { tag: Sampled, sampler: uniform(0, 1) }, stages: new Set() }); return mul(sqrt(mul(-2, ln(u1))), cos(mul(2 * Math.PI, u2))); };这一随机源还被内部用于构造随机扩散过程见 diffusionProcess是随机游走、粒子系统等场景的基础。diskRandom()单位圆盘内均匀采样diskRandom()返回单位圆盘半径为 1 的圆内均匀分布的一个二维随机点见 diskRandom 定义。实现采用 Arvo 的 Stratified Sampling of 2-Manifolds2001方法先采样两个均匀随机数u1,u2再通过极坐标变换(√u1·cos(2πu2), √u1·sin(2πu2))保证面积均匀。注意返回的是圆盘内的点而非圆环上的点。sphereRandom()单位球面上均匀采样sphereRandom()返回单位球面上均匀分布的一个三维随机点见 sphereRandom 定义。实现同样源自 Arvo 的采样方法由z 1 - 2u1与φ 2πu2构造球坐标保证球面面积均匀。仓库中的真实用法见 fancy-text.style对每个Point采样一个单位球面方向作为颜色向量并用random(18,38)随机设定圆点半径再配合ensure contains(...)约束保持图元在画布内。forall Point p { vec3 c unit(sphereRandom()) shape p.icon Circle { center: (?,?) r: random(18,38) fillColor: rgba(abs(c[0]/2),abs(c[1]/2),abs(c[2]),.25) } layer p.icon above Global.bbox shape p.text Equation { center: p.icon.center string: p.label fillColor: rgba(abs(c[0]/4),abs(c[1]/4),abs(c[2]/2),.25) fontSize: 28px } layer p.text above Global.bbox -- keep all disks on the canvas ensure contains( Global.bbox, p.icon ) }triangleRandom(a,b,c)三角形内均匀采样triangleRandom(a,b,c)返回以顶点a、b、c构成的三角形内均匀分布的一个二维随机点见 triangleRandom 定义。三个顶点参数的类型均为Real2二维点。实现使用SamplePlanarTriangle方法同样出自 Arvo 2001以s√u1、tu2构造重心坐标加权和(1-s)a s(1-t)b st·c确保面积均匀。源码视角随机值为何不可优化要理解随机采样值的常量语义关键在于stages优化阶段字段。在 Style.ts 的编译流程 中每个输入变量都带有InputMeta其中stages决定该变量参与哪些优化阶段。观察上面的源码可以看到所有随机采样函数在调用makeInput时都传入了stages: new Set()空集合意味着该变量不属于任何优化阶段、不参与优化——这与未知值?携带优化阶段标记形成鲜明对比。从 Samplers.ts 可以进一步看到随机采样的底层机制export const simpleContext (variation: string): Context { const rng seedrandom(variation); return { makeInput: (meta) variable( meta.init.tag Sampled ? meta.init.sampler(rng) : meta.init.pending, ), }; };随机种子由variation字符串决定seedrandom(variation)因此同一variation下每次运行得到的随机采样值完全一致保证图示可复现采样通过Sampler函数完成如uniform(min,max)在 Samplers.ts 中基于randFloat实现采样结果立即被variable(...)包装为自动微分变量但其stages为空优化器不会修改它。这也解释了文档中的引导性原则随机采样值就像常量一样只能作为其他可优化表达式的原料而不能被优化器调整。扩展的随机采样函数除了文档列举的六个函数计算函数字典 中还有若干补充性的随机采样工具可在 Style 中直接使用circleRandom()从单位圆圆周上均匀采样二维点见 circleRandom 定义与diskRandom()圆盘内部互补sampleColor(alpha, colorType)一次性随机采样一个颜色alpha为不透明度colorType取值rgb或hsvRGB 模式下各通道在[0.1,0.9]均匀采样HSV 模式下色相在[0,360)均匀采样见 sampleColor 定义randomIndex(minIndex, maxIndex)在[minIndex, maxIndex]区间均匀采样整数索引同样要求两个参数为常量常用于随机挑选列表元素见 randomIndex 定义。仓库中的真实用法见 chaos-day.style 与 chaos-night.stylescalar cornerIndex randomIndex(0, count(hues))随机选择混沌游戏的颜色角点。这些函数同样遵循采样一次、固定不变的常量语义全部以空stages注册。实战建议随机初始化 约束优化将随机采样函数与未知值?结合可以在多样性与可优化性之间取得平衡这是编写 Penrose Style 的核心技巧用随机采样做外观多样化形状的半径、颜色、初始角度、位移等不太重要的参数用random/sphereRandom/sampleColor随机化让每次variation生成不同的美观布局参考 dinoshade.style 的恐龙姿态随机化用?做可优化自由度需要满足几何约束的量如文档示例中的角度θ、fancy-text 示例中的圆心(?,?)声明为未知值交由ensure/encourage在优化阶段调整用variation保证可复现由于随机种子完全由variation决定见 simpleContext调整variation即可在同一布局的不同随机版本之间切换而固定variation可稳定复现结果注意参数必须是常量random与randomIndex的参数不允许是计算值或可优化值否则编译期会抛错见 random 定义。延伸阅读随机采样在 Style 表达式体系中的位置可参阅 Style 表达式参考完整函数列表含约束函数、目标函数与计算函数见 Style 函数参考随机值不可优化的底层机制见 Style 编译流程 与 采样器实现更多random系列函数的真实组合用法可阅读 fancy-text.style、dinoshade.style 与 ifs.style。赞分享开发工具数据可视化【免费下载链接】penroseCreate beautiful diagrams just by typing notation in plain text.项目地址https://gitcode.com/gh_mirrors/pe/penrose点击查看免费下载相关推荐Windows 10/11 原地升级助手如何轻松切换系统版本完整指南来了Windows 10/11 原地升级助手如何轻松切换系统版本完整指南来了 你是否曾遇到过这样的困扰想要将Windows家庭版升级到专业版却发现安装程序用 showdist.rb 与 showfreq.rb 度量 SRANDMEMBER 的随机公平性Valkey 集合随机采样工具解析用 showdist.rb 与 showfreq.rb 度量 SRANDMEMBER 的随机公平性Valkey 集合随机采样工具解析 utils/srandmKV存储缓存数据库django-reversion API详解从基础操作到高级功能的完整手册django reversion API详解从基础操作到高级功能的完整手册 想要为你的Django应用添加强大的版本控制功能吗django reversio上一篇SigmaSwiftStatistics性能优化处理大型数据集的10个实用技巧下一篇Fleet MDM 迁移实战搭建 Jamf Pro Webhook 服务自动解除 macOS 设备托管创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表