C ++のアルキメデススパイラル


8

C ++でアルキメデススパイラルの x位置とy位置をプロットしようとしています。

アルキメデスの螺旋

これまでのところ、私はこのようなものを試してきましたが、運はありません:

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

編集:詳細

ドミノをシミュレートしてBullet物理エンジンの使用方法を示す3Dゲームアプリケーションを開発しています。ドミノをシーンに手動で配置する代わりに、いくつかの数学を使用してそれを行いたいと思います:)

ここに興味がある人は、GitHubにあります


問題は、すべての変数がであることintです。特に、dxそしてdyおそらく0取得します
LHF

回答:


7

それを考え出した:)関数によって生成されたX座標とY座標に沿ってドミノが配置されています。

問題の元のコードは、中心の位置または原点から外側にポイントの波をプロットしており、私が望んでいたものではありませんでした。私が必要としたのは、各ポイントArchimedean spiralがスパイラルの間に一定の間隔を置いてを追うことでした。

最初integerxy座標を格納するために値を使用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に、あなたが必要となります弾丸freeglutを


5
あなたは問題があることが判明何を説明し、あなたがそれを修正するために何が変更されたか...場合は、この答えはさらに良いでしょう
センモウヒラムシ

1
質問を更新して、詳細情報で今すぐ回答します。
デビッド

4

これは実際にはこの質問に対する直接的な回答ではありません(既に回答が既にあります)が、このアルゴリズムを3Dで実装したい人には興味があるかもしれません。

Pythonを使用してブレンダーで3Dスパイラルを生成するためにこのアルゴリズムを実装する必要がありました(2DでPILまたはMatplotlibを使用した描画に簡単に変換できました)。だからここにアルゴリズムと結果があります:

ここに画像の説明を入力してください

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 )

これは、forループの各反復でZの高さが増加することを除いて、同じことを行いますか?
David

ほぼ対称的であることを除いて、ほとんどの場合(元のaとbの代わりに、均一なパラメーターを使用しましたsize)。
TLousky、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.