Espiral arquimediana em C ++


8

Estou tentando traçar as posições x e y de uma espiral arquimediana em C ++.

Espiral arquimediana

Até agora eu tenho tentado algo assim, mas sem sorte:

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: Mais informações

Estou desenvolvendo um aplicativo de jogo em 3D que demonstra o uso do mecanismo de física Bullet simulando dominós. Em vez de colocar os dominós na cena manualmente, quero usar um pouco de matemática para fazer isso por mim :)

Para quem estiver interessado aqui, está no GitHub .


O problema parece ser que todas as variáveis ​​são int. Em particular, dxe dyprovavelmente terá 0.
lhf 22/12/2015

Respostas:


7

Descobri isso :) Os dominós agora estão sendo colocados ao longo das coordenadas X e Y geradas pela função.

O código original da pergunta estava traçando uma onda de pontos para fora da posição ou origem central e não era o que eu queria. O que eu precisava era que cada ponto seguisse Archimedean spiralcom um certo espaço entre as espirais.

Inicialmente, usei integervalores para armazenar as coordenadas xe, ymas isso estava causando um erro de precisão ao truncar o floating pointvalor para armazená-lo no integertipo de dados.

O exemplo abaixo gera pontos ao longo da espiral continuamente, em relação ao 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);
}

O código do projeto está no GitHub , você precisará de Bullet e freeglut


5
Esta resposta seria ainda melhor se você explicou que o problema acabou por ser eo que você mudou para corrigi-lo ...
Trichoplax

11
Vou atualizar a pergunta e responder agora com mais informações.
David

4

Essa não é realmente uma resposta direta a essa pergunta (que já tem uma resposta de qualquer maneira), mas pode interessar as pessoas que desejam implementar esse algoritmo em 3D.

Eu tive que tentar implementar esse algoritmo para gerar espirais 3D no blender usando Python (poderia ser facilmente convertido em desenho com PIL ou Matplotlib em 2D). Então, aqui está o algoritmo e o resultado:

insira a descrição da imagem aqui

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 )

Isso faz o mesmo, exceto com um aumento na altura Z em cada iteração do loop for?
David

Praticamente, exceto que é sempre simétrico (em vez do original aeb, usei um sizeparâmetro uniforme ).
TLousky
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.