Spirale di Archimede in C ++


8

Sto cercando di tracciare le posizioni xey di una spirale di Archimede in C ++.

Spirale Archimedea

Finora ho provato qualcosa del genere, ma senza fortuna:

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: maggiori informazioni

Sto sviluppando un'applicazione di gioco 3D che dimostra l'uso del motore fisico Bullet simulando domino. Invece di posizionare manualmente i domino sulla scena, voglio usare un po 'di matematica per farlo :)

Per chiunque sia interessato qui è su GitHub .


Il problema sembra essere che tutte le variabili lo siano int. In particolare, dxe dyprobabilmente otterrà 0
lhf il

Risposte:


7

Capito :) I domini vengono ora posizionati lungo le coordinate X e Y generate dalla funzione.

Il codice originale nella domanda tracciava un'ondata di punti verso l'esterno dalla posizione centrale o dall'origine e non era quello che volevo. Ciò di cui avevo bisogno era che ogni punto seguisse Archimedean spiralcon un certo spazio tra le spirali.

Inizialmente ho usato i integervalori per memorizzare le coordinate xe yma ciò causava un errore di precisione troncando il floating pointvalore per memorizzarlo nel integertipo di dati.

L'esempio seguente genera punti lungo la spirale in modo continuo, rispetto al maxPointsvalore.

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

Il codice per il progetto è su GitHub , avrai bisogno di Bullet e freeglut


5
Questa risposta sarebbe ancora migliore se spiegassi quale problema si è rivelato e cosa hai cambiato per risolverlo ...
trichoplax,

1
Aggiornerò la domanda e risponderò ora con maggiori informazioni.
David,

4

Questa non è davvero una risposta diretta a questa domanda (che ha già una risposta comunque), ma potrebbe interessare le persone che vogliono implementare questo algoritmo in 3D.

Ho dovuto provare a implementare questo algoritmo per generare spirali 3D nel frullatore usando Python (poteva essere facilmente convertito in disegno con PIL o Matplotlib in 2D). Quindi ecco l'algoritmo e il risultato:

inserisci qui la descrizione dell'immagine

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 )

Questo fa la stessa cosa se non con un aumento dell'altezza Z su ogni iterazione del ciclo for?
David,

Praticamente, tranne che è sempre simmetrico (secondo l'originale aeb, ho usato un sizeparametro uniforme ).
TLousky,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.