Spiral Archimedean dalam C ++

8

Saya mencoba untuk merencanakan posisi x dan y dari spiral Archimedean di C ++.

Spiral Archimedean

Sejauh ini saya sudah mencoba sesuatu seperti ini, tetapi tidak berhasil:

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

Sunting: Info lebih lanjut

Saya sedang mengembangkan aplikasi game 3D yang menunjukkan penggunaan mesin fisika Bullet dengan mensimulasikan kartu domino. Alih-alih menempatkan domino dalam adegan secara manual, saya ingin menggunakan beberapa matematika untuk melakukannya untuk saya :)

Bagi siapa saja yang tertarik di sini ada di GitHub .

David
sumber
Masalahnya tampaknya semua variabel int. Secara khusus, dxdan dymungkin akan mendapatkan 0.
lhf

Jawaban:

7

Mencari tahu :) Domino sekarang ditempatkan di sepanjang koordinat X dan Y yang dihasilkan oleh fungsi.

Kode asli dalam pertanyaan adalah merencanakan gelombang titik keluar dari posisi tengah atau asal dan bukan yang saya inginkan. Yang saya butuhkan adalah setiap titik untuk mengikuti Archimedean spiraldengan ruang tertentu di antara spiral.

Awalnya saya menggunakan integernilai untuk menyimpan xdan ykoordinat tetapi ini menyebabkan kesalahan presisi dengan memotong floating pointnilai untuk menyimpannya di integertipe data.

Contoh di bawah ini menghasilkan titik di sepanjang spiral terus menerus, relatif terhadap maxPointsnilai.

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

Kode untuk proyek ini ada di GitHub , Anda perlu Bullet dan freeglut

David
sumber
5
Jawaban ini akan lebih baik jika Anda menjelaskan apa masalahnya dan apa yang Anda ubah untuk memperbaikinya ...
trichoplax
1
Sakit perbarui pertanyaan dan jawab sekarang dengan info lebih lanjut.
David
4

Ini bukan jawaban langsung untuk pertanyaan ini (yang sudah memiliki jawaban), tetapi mungkin menarik minat orang yang ingin mengimplementasikan algoritma ini dalam 3D.

Saya harus mencoba mengimplementasikan algoritma ini untuk menghasilkan spiral 3D dalam blender menggunakan Python (dapat dengan mudah dikonversi menjadi menggambar dengan PIL atau Matplotlib dalam 2D). Jadi inilah algoritma dan hasilnya:

masukkan deskripsi gambar di sini

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
sumber
Apakah ini melakukan hal yang sama kecuali dengan peningkatan pada ketinggian Z pada setiap iterasi loop for?
David
Cukup banyak, kecuali selalu simetris (bagian awal dari a dan b asli, saya menggunakan sizeparam seragam ).
TLousky