2011-10-25 27 views
1

私がしなければならないのは、配列を使って同じサイズの8つの三角形で構成される正方形を作ることです。正方形の四隅の座標は、(-10、-10,10)、(-10、-10、-10)、(10、-10、-10)、(10、-10,10) 。そして、それは左上から時計回りに行くことから始まります。OpenGLのforループを使った配列の作成

配列に値を入力する前にすでに作成していますが、今はC++でforループを使用する方法を理解する必要があります。だから私は、各配列(私は頂点、インデックスとカラー配列を作成する必要がある)私はforループを作成する必要があることを知っていると、forループは、内部のforループを持っている必要があります。

+0

ポイントとカラーを並列配列で定義して、それらを一度反復処理するのはなぜですか? –

+0

@ user931794最初に私はあなたが何を意味しているか分かりません(私がこれについて非常に新しいと言ったように)、私はパラレルアレイが何であるか本当に分かりません。しかし、あなたが何を意味しているのか分かっていれば、値をハードコーディングできないので、それがうまくいくとは思えません。純粋にforループを通して配列を作成しなければなりません。申し訳ありませんが、私は十分に明確でない場合、私は非常にこれに新しいですので、私は物事を説明する方法の少し不明です。 – user1010573

+0

あなたが使用している言語を指定したい場合は、[INTERCAL](http://en.wikipedia.org/wiki/INTERCAL)で人々に解決策を教えてください。 – genpfault

答えて

0

私はVecためEigen::Vector2fを使用したいが、同様のインターフェースを備えたものが動作するはずです:

template< typename Vec > 
void glVec2d(const Vec& vec) 
{ 
    glVertex2d(vec.x(), vec.y()); 
} 

template< typename Vec > 
void glTex2d(const Vec& vec) 
{ 
    glTexCoord2d(vec.x(), vec.y()); 
} 

template< typename Vec > 
void glQuad2d 
    (
    const Vec& A, // lower left coord 
    const Vec& B, // lower right coord 
    const Vec& C, // upper right coord 
    const Vec& D, // upper left coord 
    unsigned int divs = 2, 
    const Vec& At = Vec(0,0), 
    const Vec& Bt = Vec(1,0), 
    const Vec& Ct = Vec(1,1), 
    const Vec& Dt = Vec(0,1) 
    ) 
{ 
    // base case 
    if(divs == 0) 
     { 
     glTex2d(At); 
     glVec2d(A); 

     glTex2d(Bt); 
     glVec2d(B); 

     glTex2d(Ct); 
     glVec2d(C); 

     glTex2d(Dt); 
     glVec2d(D); 

     return; 
     } 

    Vec AB = (A+B) * 0.5; 
    Vec BC = (B+C) * 0.5; 
    Vec CD = (C+D) * 0.5; 
    Vec AD = (A+D) * 0.5; 
    Vec ABCD = (AB+CD) * 0.5; 

    Vec ABt = (At+Bt) * 0.5; 
    Vec BCt = (Bt+Ct) * 0.5; 
    Vec CDt = (Ct+Dt) * 0.5; 
    Vec ADt = (At+Dt) * 0.5; 
    Vec ABCDt = (ABt+CDt) * 0.5; 

    // subdivided point layout 
    // D CD C 
    // 
    // AD ABCD BC 
    // 
    // A AB B 

    // subdivide 
    glQuad2d(A, AB, ABCD, AD, divs - 1, At, ABt, ABCDt, ADt); 
    glQuad2d(AB, B, BC, ABCD, divs - 1, ABt, Bt, BCt, ABCDt); 
    glQuad2d(ABCD, BC, C, CD, divs - 1, ABCDt, BCt, Ct, CDt); 
    glQuad2d(AD, ABCD, CD, D, divs - 1, ADt, ABCDt, CDt, Dt); 
} 

それは現在の再帰的だが、あなたは常にいくつかのforループアクションを明示的にスタックを追加することができます。

+0

助けてくれてありがとうが、残念なことにこれは私がこれまで知っていたことを超えている。私は大学でゲームプログラミングを勉強しています。これは私の最初のコースなので、あまり分かりません。しかし、私は本当にすべての助けに感謝します! – user1010573

+0

これは品質のコードです。非常にエレガント。あなたがこれを何度も呼び出すことを暗に指摘していたとしても、システムスタックの代わりにヒープに割り当てられた明示的なスタックを使用することができます(つまり、関数を再帰的ではないように変更する) 。 –

関連する問題