Архимедова спираль на С ++

8

Я пытаюсь построить x и y положения архимедовой спирали в C ++.

Архимедова спираль

До сих пор я пробовал что-то вроде этого, но не повезло:

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

РЕДАКТИРОВАТЬ: Больше информации

Я занимаюсь разработкой приложения для 3D-игр, которое демонстрирует использование физического движка Bullet путем имитации домино. Вместо того, чтобы помещать домино в сцену вручную, я хочу использовать математику, чтобы сделать это для меня :)

Для всех, кто интересуется здесь, это на GitHub .

Дэвид
источник
Проблема, кажется, в том, что все переменные int. В частности, dxи dy, вероятно, получит 0.
LHF

Ответы:

7

Выяснили это :) Домино теперь размещаются вдоль координат X и Y, сгенерированных функцией.

Исходный код в вопросе строил волну точек наружу от центральной точки или начала координат, и это было не то, что я хотел. Мне нужно было, чтобы каждая точка следовала Archimedean spiralс определенным промежутком между спиралями.

Первоначально я использовал integerзначение для хранения xи yкоординат , но это вызывает прецизионную ошибку усечения floating pointзначения для того , чтобы хранить его в integerтипе данных.

Приведенный ниже пример генерирует точки вдоль спирали непрерывно относительно maxPointsзначения.

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

Код для проекта есть на GitHub , вам понадобится Bullet и freeglut

Дэвид
источник
5
Этот ответ был бы еще лучше, если бы вы объяснили, в чем заключалась проблема и что вы изменили, чтобы ее исправить ...
trichoplax
1
Я обновлю вопрос и отвечу сейчас с дополнительной информацией.
Дэвид
4

На самом деле это не прямой ответ на этот вопрос (у которого уже есть ответ), но он может заинтересовать людей, которые хотят реализовать этот алгоритм в 3D.

Мне пришлось попробовать реализовать этот алгоритм для создания трехмерных спиралей в блендере с использованием Python (его можно было легко преобразовать в рисование с помощью PIL или Matplotlib в 2D). Итак, вот алгоритм и результат:

введите описание изображения здесь

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
источник
Делает ли это то же самое, за исключением увеличения высоты Z на каждой итерации цикла for?
Дэвид
В значительной степени, за исключением его всегда симметричного (вместо оригинала a и b, я использовал единый sizeпараметр).
TLousky