1

私がしなければならないことは、配列を使用して、すべて同じサイズの 8 つの三角形で構成される正方形を作成することです。正方形の四隅の座標は、(-10, -10, 10), (-10, -10, -10), (10, -10, -10), (10, -10, 10) . そして、それは左上から始まり、反時計回りに進んでいます。

配列に値を入力する前に既に作成しましたが、C++ で for ループを使用してそれを行う方法を理解する必要があります。したがって、配列ごとに (頂点、インデックス、およびカラー配列を作成する必要があります)、for ループを作成する必要があり、その for ループには for ループが含まれている必要があることがわかっています。

4

1 に答える 1

0

私はに使用するのが好きEigen::Vector2fですVecが、同様のインターフェイスを持つものはすべて機能するはずです:

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ループアクション用に明示的なスタックをいつでも追加できます。

于 2011-10-25T19:22:57.770 に答える