如何编写心形方程?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
相关产品推荐
相关产品推荐

