2010-11-28 20 views
0

私は数学者ではありませんが、私は円で塗りつぶす必要があります。OpenGL描画円、奇妙なバグ

私のアプローチは、他の誰かの数学を使って円の円周上のすべての点を取得し、それらを三角ファンに変えることでした。

頂点配列には頂点が必要ですが、直接モードは必要ありません。

円が表示されます。しかし、サークルをオーバーレイしようとすると、奇妙なことが起こります。彼らはほんの一秒間現れて消えます。マウスを窓から動かすと、どこからも三角形が出てきます。ここで

クラスです:

class circle 
{ 
    //every coordinate with have an X and Y 
    private: 
    GLfloat *_vertices; 
    static const float DEG2RAD = 3.14159/180; 

    GLfloat _scalex, _scaley, _scalez; 
    int _cachearraysize; 

    public: 

    circle(float scalex, float scaley, float scalez, float radius, int numdegrees) 
    { 
     //360 degrees, 2 per coordinate, 2 coordinates for center and end of triangle fan 
     _cachearraysize = (numdegrees * 2) + 4; 

     _vertices = new GLfloat[_cachearraysize]; 
     for(int x= 2; x < (_cachearraysize-2); x = x + 2) 
     { 
      float degreeinRadians = x*DEG2RAD; 
      _vertices[x] = cos(degreeinRadians)*radius; 
      _vertices[x + 1] = sin(degreeinRadians)*radius; 
     } 


     //get the X as X of 0 and X of 180 degrees, subtract to get diameter. divide 
     //by 2 for radius and add back to X of 180 
     _vertices[0]= ((_vertices[2] - _vertices[362])/2) + _vertices[362]; 

     //same idea for Y 
     _vertices[1]= ((_vertices[183] - _vertices[543])/2) + _vertices[543]; 

     //close off the triangle fan at the same point as start 
     _vertices[_cachearraysize -1] = _vertices[0]; 
     _vertices[_cachearraysize] = _vertices[1]; 

     _scalex = scalex; 
     _scaley = scaley; 
     _scalez = scalez; 

    } 
    ~circle() 
    { 
     delete[] _vertices; 
    } 

    void draw() 
    { 
     glScalef(_scalex, _scaley, _scalez); 
     glVertexPointer(2,GL_FLOAT, 0, _vertices); 
     glDrawArrays(GL_TRIANGLE_FAN, 0, _cachearraysize); 
    } 
}; 
+0

深度テストはどこで設定しますか?問題を示す最小限のSDL/GLUTプログラムを投稿できますか? – genpfault

+0

2Dの場合には、奥行き検査はおそらく無効にする必要があります。また、OPは描かれる順に円が表示されることを期待しています。 – Kos

答えて

2

醜いコードですが、私は言うだろう - エトセトラマジックナンバーがたくさん。

struct Point { 
    Point(float x, float y) : x(x), y(y) {} 
    float x, y; 
}; 
std::vector<Point> points; 
const float step = 0.1; 
const float radius = 2; 

points.push_back(Point(0,0)); 
// iterate over the angle array 
for (float a=0; a<2*M_PI; a+=step) { 
    points.push_back(cos(a)*radius,sin(a)*radius); 
} 
// duplicate the first vertex after the centre 
points.push_back(points.at(1)); 

// rendering: 

glEnableClientState(GL_VERTEX_ARRAY); 
glVertexPointer(2,GL_FLOAT,0, &points[0]); 
glDrawArrays(GL_TRIANGLE_FAN,0,points.size()); 

それはあなたが好むよう、クラスとしてこれを書き換えるためにあなた次第です:

のようなものを試してみてください。後ろの数学は本当にシンプルですが、それを試して理解するのを恐れません。