我正在尝试在C ++中绘制阿基米德螺线的x和y位置。



到目前为止,我一直在尝试这样的方法,但是没有运气:

 int dx = 0;
int dy = 0;
int x = 0;
int y = 0;

for (int i = 0; i < maxPoints; i++)
{
    dx = sin(i * PI / 2);
    dy = cos(-i * PI / 2);
    x += dx;
    y += dy;

    plot(x, y);    
}
 


编辑:更多信息

我正在开发3D通过模拟多米诺骨牌演示子弹物理引擎使用的游戏应用程序。与其手动将多米诺骨牌放到场景中,不如我想使用一些数学方法为我做这件事:)

对于任何对此感兴趣的人,它都在GitHub上。

评论

问题似乎是所有变量都是int。尤其是dx和dy可能会变为0。

#1 楼

弄清楚了:)现在沿着该函数生成的X和Y坐标放置多米诺骨牌。

问题中的原始代码是从中心位置或原点向外绘制点波,这不是我想要的。我需要的是让每个点跟随Archimedean spiral,并在螺旋之间留出一定的距离。

最初,我使用integer值来存储xy坐标,但这通过截断floating point值以将其存储在integer数据类型中而引起了精度错误。

以下示例相对于maxPoints值沿螺旋连续生成点。

float x = 0;
float y = 0;
float angle = 0.0f;

// Space between the spirals
int a = 2, b = 2;

for (int i = 0; i < maxPoints; i++)
{
    angle = 0.1 * i;
    x = (a + b * angle) * cos(angle);
    y = (a + b * angle) * sin(angle);

    plot(x, y);
}


该项目的代码在GitHub上,您将需要Bullet和freeglut

评论


$ \ begingroup $
如果您解释了问题的根源以及为解决此问题而进行的更改,那么答案会更好。
$ \ endgroup $
– trichoplax
2015年12月21日在20:25

$ \ begingroup $
请立即更新问题并提供更多信息。
$ \ endgroup $
–大卫
2015年12月22日在21:22



#2 楼

这实际上不是这个问题的直接答案(无论如何已经有答案),但是可能会吸引那些想要在3D中实现此算法的人。

我不得不尝试实现此算法来生成使用Python在Blender中进行3D螺旋处理(可以使用2D的PIL或Matplotlib轻松转换为图形)。因此,这里是算法和结果:



import bpy
from math import cos, sin
S = bpy.context.scene

def add_archimedian_spiral( size = 0.1, length = 500, height = 1, name = 'archispiral' ):
    mesh = bpy.data.meshes.new( name = name )

    o = bpy.data.objects.new(name, mesh)
    o.location = (0,0,0) # place at object origin
    S.objects.link( o )

    z     = 0
    verts = []  
    for i in range( length ):
        angle = 0.1 * i
        x     = ( 2 * size * angle ) * cos( angle )
        y     = ( 2 * size * angle ) * sin( angle )
        z    += i / 10000 * height
        verts.append((x,y,z))

    edges = []
    for i in range( len( verts ) ):
        if i == len( verts ) - 1: break
        edges.append((i, i+1))

    mesh.from_pydata( verts, edges, [] )

add_archimedian_spiral( size = 0.2, length = 500, height = 6 )


评论


$ \ begingroup $
除了在for循环的每次迭代中增加Z高度之外,这是否会执行相同的操作?
$ \ endgroup $
–大卫
15年12月24日在9:37

$ \ begingroup $
除了它始终是对称的以外,几乎是其他的东西(不是原来的a和b,而是使用统一的大小参数)。
$ \ endgroup $
–TLousky
15年12月24日在9:54