Espiral de Arquímedes en C ++

8

Estoy tratando de trazar las posiciones x e y de una espiral de Arquímedes en C ++.

Espiral de Arquímedes

Hasta ahora he estado intentando algo como esto, pero no tuve suerte:

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

EDITAR: más información

Estoy desarrollando una aplicación de juego en 3D que demuestra el uso del motor de física Bullet simulando dominó. En lugar de colocar las fichas de dominó en la escena manualmente, quiero usar algunas matemáticas para hacerlo por mí :)

Para cualquiera que esté interesado aquí, está en GitHub .

David
fuente
El problema parece ser que todas las variables son int. En particular, dxy dyprobablemente obtendrá 0.
lhf

Respuestas:

7

Lo descubrí :) Las fichas de dominó ahora se colocan a lo largo de las coordenadas X e Y generadas por la función.

El código original en la pregunta estaba trazando una ola de puntos hacia afuera desde la posición central u origen y no era lo que quería. Lo que necesitaba era que cada punto siguiera Archimedean spiralcon cierto espacio entre las espirales.

Inicialmente, utilicé integervalores para almacenar las coordenadas xy, ypero esto estaba causando un error de precisión al truncar el floating pointvalor para almacenarlo en el integertipo de datos.

El siguiente ejemplo genera puntos a lo largo de la espiral continuamente, en relación con el maxPointsvalor.

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

El código para el proyecto está en GitHub , necesitará Bullet y freeglut

David
fuente
55
Esta respuesta sería aún mejor si explicara cuál fue el problema y qué cambió para solucionarlo ...
trichoplax
1
Actualizaré la pregunta y la respuesta ahora con más información.
David
4

Esta no es realmente una respuesta directa a esta pregunta (que ya tiene una respuesta de todos modos), pero podría interesar a las personas que desean implementar este algoritmo en 3D.

Tuve que intentar implementar este algoritmo para generar espirales 3D en Blender usando Python (podría convertirse fácilmente en dibujo con PIL o Matplotlib en 2D). Así que aquí está el algoritmo y el resultado:

ingrese la descripción de la imagen aquí

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
fuente
¿Esto hace lo mismo excepto con un aumento en la altura Z en cada iteración del ciclo for?
David
Más o menos, excepto que siempre es simétrico (en lugar del original ayb, utilicé un sizeparámetro uniforme ).
TLousky