You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写心形方程?100个粒子心形排列实现问题排查

修复心形粒子排列的三角函数方程问题

我看了你的代码和当前的粒子排列效果,问题核心出在三角函数的参数取值范围和映射逻辑上,咱们来一步步调整:

问题根源

你现在直接用粒子索引index乘以angle作为三角函数的输入,但index是0到99的整数,如果angle没设置成极小值,这个参数会瞬间超出三角函数的周期范围,导致粒子点完全混乱,没法形成连续的心形曲线。

咱们用的这个心形参数方程,要求参数t在**0到2π(也就是0到360度)**的范围内均匀取值,才能画出完整的心形。

修正后的代码

我调整了参数映射逻辑,同时适配UI坐标系的特性,代码如下:

val totalParticles = ps.size.toDouble()
for ((index, p) in ps.withIndex()) {
    // 将粒子索引映射到0~2π的弧度范围,确保每个粒子对应心形曲线上的均匀点
    val t = (index / (totalParticles - 1)) * 2 * Math.PI
    // 标准心形参数方程
    val x = 16 * Math.pow(Math.sin(t), 3.0)
    val y = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t)
    
    // 缩放系数:根据你的面板大小调整,让心形尺寸合适
    val scale = 10.0
    // UI坐标系y轴向下递增,所以给y加负号让心形正过来
    p.layoutX = startX + x * scale
    p.layoutY = startY - y * scale
}

关键调整点说明

  • 参数t的正确映射:把每个粒子的索引转换成0到2π之间的均匀值,这样100个粒子会均匀分布在心形曲线的整个路径上
  • 坐标系适配:UI组件的layoutY是向下为正,而数学坐标系中y轴向上为正,所以给y值加负号,让心形不会倒过来
  • 缩放控制:原方程输出的x范围大概是-1616,y范围是-1413,直接用的话心形会很小,通过scale参数可以放大到适合你面板的尺寸
  • 高效遍历:用withIndex()遍历比ps.indexOf(p)效率高很多,尤其是粒子数量多的时候

之前你尝试用Math.toRadians没解决问题,是因为参数范围没控制对,现在t本身就是弧度值,不需要再做角度转换啦。

内容的提问来源于stack exchange,提问作者Programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:33:20