2012-02-20 15 views
3

基本的に水平線として機能する円の輪郭線を描画する方法を探しています。私はサークルを埋めるのではなく、むしろ横から見るときでも見える白い線を持っています。これは可能ですか?誰かが私にチュートリアルを見せることができますか?OpenGLでアンドロイドで円を描く

私はあなたがgl.glLineWidth(20)を使用する場合と思い

答えて

8

SteveLよりも効率的な方法があります。

各点の三角関数を計算するのではなく(計算コストの高い方法)、現在の点、接線ベクトル、および余弦ベクトルに基づいて円上の次の点を見つけることができます。三角関数は1回計算され、その後の各点は一連の乗算であり、はるかに高速です。

このページのOpenGLのためのプロセスの非常に明確なステップスルーを提供していますが、それは、OpenGL ESに動作させるためにスティーブの答えを簡単に適用することができます。私は今、望んでいた場合は...

http://slabode.exofire.net/circle_draw.shtml

+0

私は彼がtrig関数を繰り返し使用せずに描画する方法を説明した方法が好きです。私は質問するのが大好きですが、どうやってtx、tyの値を計算しましたか。 –

+0

方向(CWまたはCCW)が考慮されるように円弧を描くことについての説明も有用であろう。例えば、 slabodeコードを使用してラウンドジョインを描画するオフセットポリゴンを指定すると、開始角度と終了角度はどのような順序でもかまいません。またポリゴン自体がCWまたはCCWでもかまいません。巻線順序が非常に重要です。ただし、円弧の角度(終了角度)が開始角度より大きい場合、コードはうまく動作します。 –

+0

リンクが機能していません – Confuse

3

;(または他のサイズの)ラインのthik円のvericesを取得するには(propably私は間違っているが、試してみる価値だ)あまりに

をinceaseます:

 float[] verts=MakeCircle2d(1,100,0,0) 

    public static float[] MakeCircle2d(float rad,int points,float x,float y)//x,y ofsets 
    { 
      float[] verts=new float[points*2+2]; 
      boolean first=true; 
      float fx=0; 
      float fy=0; 
      int c=0; 
      for (int i = 0; i < points; i++) 
      { 
        float fi = 2*Trig.PI*i/points; 
        float xa = rad*Trig.sin(fi + Trig.PI)+x ; 
        float ya = rad*Trig.cos(fi + Trig.PI)+y ; 
        if(first) 
        { 
         first=false; 
         fx=xa; 
         fy=ya; 
        } 
        verts[c]=xa; 
        verts[c+1]=ya; 
        c+=2; 
      } 
      verts[c]=fx; 
      verts[c+1]=fy; 
      return verts; 
     } 

あなたは空のサークルをしたい場合

gl.glDrawArrays(GL10.GL_LINES, 0, verts.length/2); 

それとも、満たされた1

たい場合GL10.GL_TRIANGLE_FANとしてそれを描くGL10.GL_LINESとしてそれを描きます
gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, verts.length/2); 
+0

恐ろしい感謝を空の円から5度ごとに垂線を引いて、それを同時に行うか、配列をもう一度やり直しますか? – erik