我试图沿着正弦曲线均匀地定位精灵(视觉上是圆形的,例如半径50)。
目前,我用于x和y的函数是:
for(int i=0; i<number_of_sprites; i++){
x = sprite_index*60
y = sin(sprite_index)*60
sprite.position = CGPointMake(x, y)
}
即使精灵沿x轴均匀分布,你也不是彼此等距的。
这有些伪代码 - 我只是在寻找数学函数来做到这一点。
我该如何解决这个问题?
答案 0 :(得分:5)
根据math.stackexchange.com上的this answer,计算沿正弦波的弧长的解决方案是椭圆积分,难以分析计算。
幸运的是,您可以使用计算机,使用数值积分来应用相同的公式,以实现所需曲线的近似。
鉴于sin(x)
的导数为cos(x)
,如果您非常缓慢地增加x
变量(每步增量为dx
),那么在每一步ds
将为dx * sqrt(1 + cos(x)^2)
。继续累积ds
值,直到达到(或超过)您想要的间距,然后画一个点。
答案 1 :(得分:0)
所以你有两个约束。给定一个点a
,一个半径r
和一个函数f
,您需要找到一个点b
s.t。
Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2)) === 2r
和
f(b.x) == b.y
第一个条件确保两个点完全不重叠,第二个条件确保b在你想要的曲线上(在这种情况下,我认为这个函数是Math.sin
)。
你需要做一些代数来得到解决方案,但这就是我设置这个问题的方法。