Spirale archimédienne en C ++

8

Im essayant de tracer les positions x et y d'une spirale archimédienne en C ++.

Spirale archimédienne

Jusqu'à présent, j'ai essayé quelque chose comme ça, mais pas de chance:

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);    
}

EDIT: Plus d'infos

Je développe une application de jeu 3D qui démontre l'utilisation du moteur physique Bullet en simulant des dominos. Au lieu de placer les dominos dans la scène manuellement, je veux utiliser des mathématiques pour le faire pour moi :)

Pour tous ceux qui sont intéressés ici, c'est sur GitHub .

David
la source
Le problème semble être que toutes les variables le sont int. En particulier, dxet dyobtiendra probablement 0.
lhf

Réponses:

7

Compris :) Les dominos sont maintenant placés le long des coordonnées X et Y générées par la fonction.

Le code original dans la question traçait une vague de points vers l'extérieur depuis la position centrale ou l'origine et n'était pas ce que je voulais. Ce dont j'avais besoin, c'était que chaque point suive le Archimedean spiralavec un certain espace entre les spirales.

Initialement, j'ai utilisé des integervaleurs pour stocker les coordonnées xet ymais cela provoquait une erreur de précision en tronquant la floating pointvaleur afin de la stocker dans le integertype de données.

L'exemple ci-dessous génère des points le long de la spirale en continu, par rapport à la maxPointsvaleur.

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);
}

Le code du projet est sur GitHub , vous aurez besoin de Bullet et de freeglut

David
la source
5
Cette réponse serait encore meilleure si vous expliquiez quel était le problème et ce que vous aviez changé pour le résoudre ...
trichoplax
1
Ill mettre à jour la question et répondre maintenant avec plus d'informations.
David
4

Ce n'est pas vraiment une réponse directe à cette question (qui a déjà une réponse de toute façon), mais pourrait intéresser les personnes qui souhaitent implémenter cet algorithme en 3D.

J'ai dû essayer d'implémenter cet algorithme pour générer des spirales 3D dans Blender en utilisant Python (pourrait facilement être converti en dessin avec PIL ou Matplotlib en 2D). Voici donc l'algorithme et le résultat:

entrez la description de l'image ici

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 )
TLousky
la source
Est-ce que cela fait la même chose sauf avec une augmentation de la hauteur Z à chaque itération de la boucle for?
David
À peu près, sauf qu'il est toujours symétrique (au lieu de l'original a et b, j'ai utilisé un sizeparamètre uniforme ).
TLousky