生成符合自定义峰值位置的钟形曲线高度数组
技术百科
聖光之護
发布时间:2026-01-27
浏览: 次 本文介绍如何基于正态分布概率密度函数(pdf)生成覆盖整数区间 [0, 10] 的平滑钟形高度序列,支持自由设定峰值位置(如偏移至 x=3)和最大高度

在程序化生成地形、UI 动画缓动曲线或数据可视化中,常需构造一条“钟形”高度分布——起始于 0、终止于 10、峰值可控、整体平滑。虽然贝塞尔曲线(如 BezierJS)灵活直观,但若仅需数学上可预测、可参数化、易缩放的单峰曲线,正态分布的概率密度函数(PDF)是更简洁高效的选择。
✅ 核心原理:正态 PDF + 线性归一化
正态 PDF 公式如下(无需积分,仅求点值):
$$ f(x) = \frac{1}{\sigma\sqrt{2\pi}} \cdot e^{-\frac{(x-\mu)^2}{2\sigma^2}} $$
其中:
- μ(mean)控制峰值横坐标(如设为 3 即峰值在 x=3);
- σ(stdDev)控制“宽度”:σ 越小,曲线越陡峭;越大则越扁平;
- 函数天然关于 μ 对称,满足“钟形”要求。
由于 PDF 原始输出最大值不为 100,我们采用线性缩放法:先计算所有采样点中的最大 y 值 maxY,再将每个 y 乘以缩放因子 100 / maxY,确保最终数组严格满足 maxHeight = 100。
? 示例代码(完整可运行)
以下代码生成 [0,1,2,...,10] 对应的 11 个高度值,并用 Chart.js 可视化,集成 chartjs-plugin-dragdata 支持拖拽调节各点:
⚠️ 注意事项与进阶提示
- 非对称需求? 正态 PDF 天然对称。若需真正左/右偏斜(skewed bell),可考虑 Skew Normal Distribution 或分段二次/三次插值(如使用 BezierJS 构造控制点后 curve.get(t) 采样)。
- 整数点精度: 上述代码以 step = 1 严格对应 [0,1,...,10],若需更高密度(如每 0.5 单位采样),只需调整 step 并对结果取整或插值。
- 性能友好: PDF 计算为 O(n),无迭代或数值积分,适合实时生成(万级点亦无压力)。
-
替代库参考:
- BezierJS:适合手绘拟合 → const curve = new Bezier(p0, p1, p2, p3); curve.get(t);
- mathjs:提供 math.distribution('Normal') 封装;
- d3-shape:d3.line().curve(d3.curveBasis) 用于平滑连接离散点。
✅ 总结:当目标是参数简洁、数学可控、峰值可偏移、结果确定的钟形高度生成时,正态 PDF + 线性归一化是最轻量且专业的方案;配合 Chart.js 插件,即可快速构建带 UI 交互的“迷你 Inkscape 曲线编辑器”。
# ai
# js
# 数据可视化
# .net
# git
# github
# 封装
# pdf
# canva
# const
# cdn
# nas
# npm
# math
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- c++ std::future和std::prom
- PHP 中 require() 语句返回值的用法详
- Dapper的Execute方法的返回值是什么意思
- mac怎么安装pip_MAC Python pip
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- PHP cURL GET请求:正确设置请求头与身份
- 如何用::实现单例模式_php静态方法与作用域操作
- Windows如何使用注册表查找和删除项?(reg
- Win11怎么开启剪贴板历史记录_Windows1
- Win10如何卸载预装Edge扩展_Win10卸载
- php8.4新语法match怎么用_php8.4m
- Windows10系统怎么查看显卡型号_Win10
- 如何使用Golang log记录不同级别日志_Go
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- 如何在 Go 中正确初始化结构体中的 map 字段
- C#如何使用Channel C#通道实现异步通信
- Win11任务栏天气怎么关闭 Win11隐藏天气小
- php打包exe怎么传递参数_命令行参数接收方法【
- php增删改查需要哪些扩展_开启mysqli或pd
- 如何在Golang中实现服务熔断与限流_Golan
- Windows10如何更改桌面图标间距_Win10
- Windows10怎样连接蓝牙设备_Windows
- Win11怎么连接投影仪_Win11多显示器投屏设
- php修改数据怎么批量改状态_批量更新status
- 如何在Golang中优化文件读写性能_使用缓冲和并
- C#如何在一个XML文件中查找并替换文本内容
- Windows10怎么用“讲述人”读屏辅助 Win
- Win11开机自检怎么关闭_跳过Win11开机磁盘
- c++23 std::expected怎么用 c+
- Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱
- C#怎么创建控制台应用 C# Console Ap
- c++中如何使用auto关键字_c++11类型推导
- Win11怎么更改默认打开方式_Win11关联文件
- VSC怎么在PHP中调试MySQL_数据库交互排查
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- c# 在高并发场景下,委托和接口调用的性能对比
- 如何在 Go 中可靠地测试含 time.Time
- Windows蓝屏错误0x00000018怎么处理
- Windows如何设置登录时的欢迎屏幕背景?(锁屏
- php中$this和::能混用吗_对象与静态作用域
- Python项目回滚策略_发布安全说明【指导】
- Windows11怎么用“记事本”自动换行与编码
- Win11怎么设置默认邮件客户端 Win11修改M
- 如何在Golang中实现自定义Benchmark_
- Win11键盘快捷键大全_Windows 11常用
- Win11怎么关闭内容自适应亮度_Windows1
- Go 中的 := 运算符:类型推导机制与使用边界详
- 短链接怎么用php递归还原_多层加密链接的处理法【
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- php转mp4怎么保留字幕_php处理带字幕视频转

QQ客服