沿着sin曲线均匀的空间圆圈

时间:2014-10-07 00:06:47

标签: javascript math

我试图沿着正弦曲线均匀地定位精灵(视觉上是圆形的,例如半径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轴均匀分布,你也不是彼此等距的。

这有些伪代码 - 我只是在寻找数学函数来做到这一点。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

根据math.stackexchange.com上的this answer,计算沿正弦波的弧长的解决方案是椭圆积分,难以分析计算。

幸运的是,您可以使用计算机,使用数值积分来应用相同的公式,以实现所需曲线的近似

鉴于sin(x)的导数为cos(x),如果您非常缓慢地增加x变量(每步增量为dx),那么在每一步ds将为dx * sqrt(1 + cos(x)^2)。继续累积ds值,直到达到(或超过)您想要的间距,然后画一个点。

请参阅http://jsfiddle.net/alnitak/fp7aknoc/了解演示。

答案 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)。

你需要做一些代数来得到解决方案,但这就是我设置这个问题的方法。