• ベストアンサー

OpenGLでプログラミングをお願いします。

OpenGLでプログラミングをお願いします。 単刀直入に申し上げます。 画像のようなものができるよう プログラミングを代わりにお願いします。 最初に正解をプログラミングを組んで いただいた方にポイントを渡そうと思いますm(__)m

質問者が選んだベストアンサー

  • ベストアンサー
  • R_Earl
  • ベストアンサー率55% (473/849)
回答No.1

だんごの描画プログラムの質問を見たものです。 とりあえず基本方針だけ示しておきます。 [1] 円を描画する関数を作る 座標(x, y)を中心とする半径rの円の円周を 透明度alphaの線で描画する関数を drawCircle(x, y, r, alpha)とします。 これをまず作りましょう。 OpenGLではデフォルトで円を描画する関数が無いらしいので、 点、線、多角形を上手く利用してそれらしいものを作るしかないと思います。 だんご描画プログラムができているのであれば、 その時に使った円描画の方法を流用できます。 なのでこれはさほど苦労しないと思います。 [2] メイン部分を作る。 添付画像に描かれている各円の中心位置を計算してあげます。 で、その計算した位置に円を描くように 関数drawCircle(x, y, r, alpha)を並べるだけで完成です(メイン部分の関数の中に)。 例えば drawCircle(90, 50, 30, 1.0); drawCircle(80, 76, 30, 0.9); drawCircle(70, 84, 30, 0.8); ・ ・ ・ と書けばよいです(結構適当に計算しています)。 円の中心座標計算が面倒ですが、それさえできれば何とかなります。 極座標を利用して円の中心位置を指定してあげることもできます。 それを上手く利用できれば、わざわざdrawCircleをたくさん並べなくても for(…; …; …){  drawCircle(…, …, …, …); } という3行だけで、添付図の画像のような円描画が実現できます。 上手く極座標を利用する方法が思いつかない(または極座標を知らない)のであれば、 わざわざ後者のような方法を使って簡潔に書こうとしなくても良いです。 前者のような形式で作れば良いと思います。

asaduki
質問者

お礼

返信遅くなって申し訳ありませんでした。 無事課題が終わりました。 感謝いたします!! 投稿時間が早い方をベストアンサーと させていただきました。

その他の回答 (1)

  • sygh
  • ベストアンサー率76% (42/55)
回答No.2

#include <cmath> #include <GL/glut.h> const float F_PI = 3.14159265f; inline float ToRadian(float x) { return x * F_PI / 180.0f; } void OnDisplay() { glClear(GL_COLOR_BUFFER_BIT); const float r1 = 7.0f, r2 = 2.3f; float cx, cy, t0, t1; for (int i = 360; i > 0; i -= 10) { cx = r1 * cos(ToRadian(i)); cy = r1 * sin(ToRadian(i)); glColor4f(1, 0, 0, i / 360.0f); glBegin(GL_LINE_LOOP); for (int j = 0; j < 360; j++) { t0 = ToRadian(j); t1 = ToRadian(j + 1); glVertex2f(cx + r2 * cos(t0), cy + r2 * sin(t0)); glVertex2f(cx + r2 * cos(t1), cy + r2 * sin(t1)); } glEnd(); } glFlush(); } void OnResize(int w, int h) { glViewport(0, 0, w, h); glLoadIdentity(); glOrtho(-10, 10, -10, 10, -1, 1); } void Init() { glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glClearColor(0, 0, 0, 1); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA); glutInitWindowSize(400, 300); glutCreateWindow(argv[0]); glutDisplayFunc(OnDisplay); glutReshapeFunc(OnResize); Init(); glutMainLoop(); return 0; } C++ソースとしてコンパイルしてください。VC++ 2008 SP1とGLUT 3.7.6で検証しています。 ただし線分を繋げて楕円を描画するこの方法は高速ではないし、あまり拡大した場合角度分割数を上げないと美しくなくなるので、2次元の楕円を高速かつ綺麗に描画したいのであれば、Bresenhamのデジタル円描画アルゴリズムなどを勉強されることをお勧めします。

asaduki
質問者

お礼

返信遅くなって申し訳ありませんでした。 無事課題が終わりました。 感謝いたします!! 投稿時間が早い方をベストアンサーと させていただきました。

関連するQ&A