Vòng xoắn ốc Archimedean trong C ++


8

Tôi đang cố gắng vẽ đồ thị vị trí x và y của một hình xoắn ốc Archimedean trong C ++.

Archimedean xoắn ốc

Cho đến nay tôi đã thử một cái gì đó như thế này, nhưng không có may mắn:

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: Thêm thông tin

Tôi đang phát triển một ứng dụng trò chơi 3D thể hiện việc sử dụng công cụ vật lý Bullet bằng cách mô phỏng các trò chơi domino. Thay vì đặt domino vào cảnh thủ công, tôi muốn sử dụng một số phép toán để làm điều đó cho tôi :)

Đối với bất cứ ai quan tâm ở đây là trên GitHub .


Vấn đề dường như là tất cả các biến int. Cụ thể, dxdycó thể sẽ nhận được 0.
lhf

Câu trả lời:


7

Tìm ra nó :) Các domino hiện đang được đặt dọc theo tọa độ X và Y được tạo bởi hàm.

Mã ban đầu trong câu hỏi là vẽ một làn sóng các điểm ra khỏi vị trí trung tâm hoặc điểm gốc và không phải là điều tôi muốn. Những gì tôi cần là cho mỗi điểm để theo dõi Archimedean spiralvới một không gian nhất định giữa các vòng xoắn ốc.

Ban đầu tôi đã sử dụng integercác giá trị để lưu trữ xytọa độ nhưng điều này gây ra lỗi chính xác bằng cách cắt bớt floating pointgiá trị để lưu trữ nó trong integerkiểu dữ liệu.

Ví dụ dưới đây tạo ra các điểm dọc theo vòng xoắn ốc liên tục, liên quan đến maxPointsgiá trị.

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

Mã cho dự án là trên GitHub , bạn sẽ cần Bulletfreeglut


5
Câu trả lời này sẽ còn tốt hơn nữa nếu bạn giải thích vấn đề hóa ra là gì và bạn đã thay đổi gì để khắc phục nó ...
trichoplax

1
Ill cập nhật câu hỏi và trả lời ngay bây giờ với nhiều thông tin hơn.
David

4

Đây thực sự không phải là một câu trả lời trực tiếp cho câu hỏi này (dù sao cũng đã có câu trả lời), nhưng có thể khiến những người muốn thực hiện thuật toán này ở chế độ 3D quan tâm.

Tôi đã phải thử thực hiện thuật toán này để tạo các hình xoắn ốc 3D trong máy xay bằng Python (có thể dễ dàng chuyển đổi thành bản vẽ bằng PIL hoặc Matplotlib ở dạng 2D). Vì vậy, đây là thuật toán và kết quả:

nhập mô tả hình ảnh ở đây

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 )

Điều này có làm điều tương tự ngoại trừ việc tăng chiều cao Z trên mỗi lần lặp của vòng lặp for không?
David

Khá nhiều, ngoại trừ nó luôn luôn đối xứng (istead của a và b gốc, tôi đã sử dụng một sizeparam param).
TLousky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.