Archimedische Spirale in C ++

8

Ich versuche, die x- und y-Positionen einer archimedischen Spirale in C ++ zu zeichnen .

Archimedische Spirale

Bisher habe ich so etwas versucht, aber kein Glück:

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: Weitere Infos

Ich entwickle eine 3D-Spieleanwendung, die die Verwendung der Bullet- Physik-Engine durch Simulation von Dominosteinen demonstriert . Anstatt die Dominosteine ​​manuell in der Szene zu platzieren, möchte ich etwas Mathematik verwenden, um dies für mich zu tun :)

Für alle, die sich hier interessieren, ist es auf GitHub .

David
quelle
Das Problem scheint zu sein, dass alle Variablen sind int. Insbesondere dxund dywird wahrscheinlich 0.
lhf

Antworten:

7

Ich habe es herausgefunden :) Die Dominosteine ​​werden jetzt entlang der von der Funktion erzeugten X- und Y-Koordinaten platziert.

Der ursprüngliche Code in der Frage zeichnete eine Welle von Punkten von der Mittelposition oder dem Ursprung nach außen und war nicht das, was ich wollte. Was ich brauchte, war, dass jeder Punkt dem Archimedean spiralmit einem bestimmten Abstand zwischen den Spiralen folgte.

Anfangs habe ich integerWerte zum Speichern von xund yKoordinaten verwendet, aber dies verursachte einen Genauigkeitsfehler, indem der floating pointWert abgeschnitten wurde, um ihn im integerDatentyp zu speichern .

Das folgende Beispiel generiert kontinuierlich Punkte entlang der Spirale relativ zum maxPointsWert.

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

Code für das Projekt ist auf GitHub , Sie benötigen Bullet und Freeglut

David
quelle
5
Diese Antwort wäre noch besser, wenn Sie erklären würden, was das Problem war und was Sie geändert haben, um es zu beheben ...
Trichoplax
1
Ich aktualisiere die Frage und antworte jetzt mit weiteren Informationen.
David
4

Dies ist keine direkte Antwort auf diese Frage (die ohnehin schon eine Antwort hat), könnte aber Leute interessieren, die diesen Algorithmus in 3D implementieren möchten.

Ich musste versuchen, diesen Algorithmus zu implementieren, um 3D-Spiralen in Blender mit Python zu generieren (konnte leicht in Zeichnen mit PIL oder Matplotlib in 2D konvertiert werden). Hier ist der Algorithmus und das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

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
quelle
Tut dies dasselbe, außer mit einer Erhöhung der Z-Höhe bei jeder Iteration der for-Schleife?
David
Ziemlich genau, außer dass es immer symmetrisch ist (anstelle des Originals a und b habe ich einen einheitlichen sizeParameter verwendet).
TLousky