私は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ループアクションを明示的にスタックを追加することができます。
ポイントとカラーを並列配列で定義して、それらを一度反復処理するのはなぜですか? –
@ user931794最初に私はあなたが何を意味しているか分かりません(私がこれについて非常に新しいと言ったように)、私はパラレルアレイが何であるか本当に分かりません。しかし、あなたが何を意味しているのか分かっていれば、値をハードコーディングできないので、それがうまくいくとは思えません。純粋にforループを通して配列を作成しなければなりません。申し訳ありませんが、私は十分に明確でない場合、私は非常にこれに新しいですので、私は物事を説明する方法の少し不明です。 – user1010573
あなたが使用している言語を指定したい場合は、[INTERCAL](http://en.wikipedia.org/wiki/INTERCAL)で人々に解決策を教えてください。 – genpfault