ポインタを使った引数を利用して,座標回転の関数を作ってみる。 |
●2次元の座標上で座標回転を行う関数を考えてみる。
座標(x, y) を,(xc, yc)を中心に θラジアン回転した座標は,次の式で計算できることが知られている。
・回転した後のX座標 = (x - xc) * cosθ - (y - yc) * sinθ + xc
・回転した後のY座標 = (x - xc) * sinθ + (y - yc) * cosθ + yc
※ただし,数学の座標とコンピュータ画面座標ではy軸方向が逆なので,注意する必要がある。
この座標の回転を計算してくれる関数 rotation2D() は以下の様に定義できる。
main_rotation.cpp
#include "DxLib.h" /* DXライブラリという便利な機能を使うため */ #include <math.h> /* C言語に用意されているsin()とcos()を使うため */ /* 座標(x, y) を,(xc, yc)を中心にthetaラジアン回転した座標をそれぞれ,*xp, *yp に返す関数 rotation2D() */ void rotation2D( double * xp, double * yp, double x, double y, double xc, double yc, double theta ) { y = -y; yc = -yc; // 数学座標と同じ様にするためにy座標値を反転 *xp = (x - xc) * cos(theta) - (y - yc) * sin(theta) + xc; *yp = -1.0 * ( (x - xc) * sin(theta) + (y - yc) * cos(theta) + yc ); } int main() { double PI = 3.14159265358979323846; double xc = 640/2, yc = 480/2; double x0 = 50 + xc, y0 = 20 + yc; // 頂点0の座標 double x1 = 0 + x0, y1 = -40 + y0; double x2 = 30 + x0, y2 = 0 + y0; double angle = 5.0; // 1回あたりの回転角5.0度 SetDrawScreen( DX_SCREEN_BACK ); /* 描画先を裏画面に設定する */ long i = 0; while( 1 ){ /* 無限に繰り返す(無限ループ) */ double tx0, ty0, tx1, ty1, tx2, ty2; rotation2D( &tx0, &ty0, x0, y0, xc, yc, (angle/180.0) * PI * i ); rotation2D( &tx1, &ty1, x1, y1, xc, yc, (angle/180.0) * PI * i ); rotation2D( &tx2, &ty2, x2, y2, xc, yc, (angle/180.0) * PI * i ); i++; ClsDrawScreen(); /* 描画先画面をきれいに消去する */ DrawPixel( xc, yc, GetColor( 255, 0, 0 ) ); DrawTriangle( tx0, ty0, tx1, ty1, tx2, ty2, GetColor( 0, 255, 100 ), FALSE ); ScreenFlip(); /* 裏画面に描画したものを表画面に転写する */ WaitTimer( 10 ); if( CheckHitKey(KEY_INPUT_ESCAPE) ) break; /* エスケープキーが押されたら繰り返し処理から出る */ } /* while()の閉じ中括弧 */ return 0; }