はじめに
- 演習7.1: マウス入力による矩形描画
- 課題7.1: マウス入力による三角形描画
- 課題7.2: マウス入力による円描画
各課題に取り組む手順
- まず自力でプログラムを書いてみる. 間違っていても構わない.教科書やWeb上のリファレンスを見ても構わない.
- ひととおり入力を終えたら,ビルドする前にソースをレポートに貼り付けておく.
- ビルドする.ビルドエラーをレポートに貼り付けておく.
- エラーを取り除き,正しく動作するプログラムを作成する.
- 自力で考えた限界のソースコードをレポートに貼り付けておく.
- 友人と相談した場合,誰と相談したか,また,相談した結果気がついた間違いをレポートに記述する.
- 完成版のソースコード,および,実行結果の画像をレポートに貼り付ける.
[準備]
前回までのことを踏まえて,ライブラリなどを適切な場所へコピーしておく.
第3回のページへ
演習7.1
マウスでドラッグされた場所に矩形を描画するプログラムを作成する.
以下のソースコードを入力する.
Step 1: 矩形を描画するコード例

OpenGLとGLUTを用いたプログラムは,以下のようにイベント駆動型となる.

- 画面を描画する関数display()では,drawRect()を用いて矩形を描画する.
- マウスを利用する場合は、glutMouseFunc()にマウス操作イベントハンドラ関数mouse()を登録する。
- mouse()では,マウスのボタンが押されたときに矩形の始点の座標を記録し,マウスのボタンが離されたときに矩形の終点の座標を記録する.
- 始点と終点をもとに新しい矩形を作成する.
マウス操作イベントハンドラ関数mouse()
書式: void mouse(int button, int state, int x, int y)
引数:
int button: 左ボタン(GLUT_LEFT_BUTTON)、中央ボタン(GLUT_MIDDLE_BUTTON)、右ボタン(GLUT_RIGHT_BUTTON)
int state: ボタンを押した場合(GLUT_DOWN)、ボタンを離した場合(GLUT_UP)
int x, y: マウスのスクリーン座標(x, y)。ピクセル単位で左上が原点(0,0)。
戻り値:
なし
Step 2: マウス操作イベントハンドラ関数のmouse()を追加する

- 実行し,描画ウインドウ内でマウスをクリック&リリースするとコマンドプロンプトにつぎのように表示される.

Step 3: スクリーン座標系の確認
スクリーン座標系の表示コード例

- 実行し,描画ウインドウ内でマウスをクリック&リリースするとコマンドプロンプトにつぎのようにクリックした座標が表示される.

Step 4: スクリーン座標系から空間座標系への変換

空間座標系の表示コード例
- mouse()関数をコピーして,関数名をmouse_sp()に変更する.
- mouse_sp()の中身は,以下のように変更する.
- また,main()関数の中にあるglutMouseFunc()関数の引数をmouseからmouse_spに変更しておく.

- 実行すると,以下のようにスクリーン座標が空間座標に変換されて表示される.

Step 5: マウスクリック・リリース時の空間座標を格納して、新しい矩形を描画
ソースコード
- ① グローバル変数を追加する.
- ② display()関数の適切な場所を以下のようにコメントアウトし,一部修正する.

- ③ mouse_sp()関数を以下のように修正する.

- 警告に関して
- p_pos, p_size, p_color に対して、「コード:C6011 NULLポインター'p_pos'を逆参照しています。」というような警告が出ますが、それらは無視してください。
- 実行結果
- 実行し,描画ウインドウ内でマウスをクリックし,右下へドラッグしてリリースすると矩形が描画される.

課題7.1
- 三角形を描画する関数drawTri()を作成し、マウスをドラッグする毎に三角形が描画されるプログラムを作成せよ.
描画される三角形の座標は、1)マウスの左ボタンを押した座標、2)左ボタンを離した座標、3)ランダム座標の3点とすること.
ヒント
((double)rand()/RAND_MAX)*2-1;
課題7.2 (応用)
- 余力のある人は,課題7.2にチャレンジしてみよう.
- 円を描画する関数drawCir()を作成し、マウスをドラッグする毎に円が描画されるプログラムを作成せよ.
描画される円は、マウスの左ボタンを押した場所が円の中心、左ボタンを離した場所が半径とすること.
ヒント
- 半径の計算方法
- 1. 左ボタンを押した座標から離した座標までの距離を計算する
例:posLength[i] = (posEnd[i]-posBegin[i]
2. ピタゴラスの定理から半径を計算する
例:radius[0] = sqrt(posLength[0]*posLength[0]+posLength[1]*posLength[1]
レポート
- 提出先・期限
- https://www.kagoshima-u.ac.jp/manaba/の「プログラミング言語I及び演習」のレポートより提出
- 演習当日の23:55まで
- 内容
- Microsoft Wordを用いてレポートを作成すること.
下記について記述すること.
- 演習7.1 (最終ソースコード,実行結果)
- 課題7.1 (ビルド前のソース,最初のビルドで見つかったエラーの一覧,自力で考えた限界のソースコード,最終ソースコード,実行結果)
- 課題7.2 (ビルド前のソース,最初のビルドで見つかったエラーの一覧,自力で考えた限界のソースコード,最終ソースコード,実行結果)
- 結論 (今回の演習を通じて学んだことについて客観的かつ具体的に述べる.)
- 所感 (感想や意見などを自由に書いてよい.)
- 提出ファイル
- Wordファイルにソースコードやキャプチャした実行画面などを貼り付けてmanabaのレポートから提出すること.
- (*.cファイルを送る必要はありません。)
- テンプレート等(Word)
- Word表紙 (回数やタイトルなどを適宜修正して使うこと.)