前半の文章はさっぱり意味がわからなかったのですが、
図を見たら一発で理解できました(w
行列を使うと比較的簡単にできるかと思います。
まず、移動、回転、スケールそれぞれの行列を作ります。
posX、posYは表示したい絵の中心の座標で、angleは角度(ラジアン)、
scaleX、scaleYはスケール値です。今回は縦に半分なので
scaleXは 1で、scaleYは 0.5を入れておきます。
MATRIX rotMat, transMat, scaleMat;
CreateTranslationMatrix(&transMat, posX, posY, 0.f);
CreateRotationZMatrix(&rotMat, angle);
CreateScalingMatrix(&scaleMat, scaleX, scaleY, 1.f);
移動、回転、スケールを合わせた行列を作ります。
MATRIX trsMat;
CreateIdentityMatrix(&trsMat);
CreateMultiplyMatrix(&trsMat, &trsMat, &rotMat);
CreateMultiplyMatrix(&trsMat, &trsMat, &scaleMat);
CreateMultiplyMatrix(&trsMat, &trsMat, &transMat);
このテーブルは絵を表示する際に基本となる4隅の座標を
中心からのオフセットで表したものです。
imageHarfSizeXと imageHarfSizeYはそれぞれ画像の大きさの半分の
大きさを入れておきます(GetGraphSize()で取得した値の半分)。
つまり、100x100なら、それぞれ50が入ります。
VECTOR pos[4] =
{
{ - imageHarfSizeX, - imageHarfSizeY },
{ + imageHarfSizeX, - imageHarfSizeY },
{ + imageHarfSizeX, + imageHarfSizeY },
{ - imageHarfSizeX, + imageHarfSizeY },
};
このテーブルの位置情報を行列に掛け合わせて、移動・回転・スケールを
行った後の座標を計算します。
for(int n=0; n<4; ++n)
{
VectorTransform(&pos[n], &pos[n], &trsMat);
}
あとは4隅を指定できる DrawModiGraphF()を使って表示します。
DrawModiGraphF(pos[0].x, pos[0].y, pos[1].x, pos[1].y,
pos[2].x, pos[2].y, pos[3].x, pos[3].y, image, FALSE);
これで angle値を適当に増減すれば、図のような
変形をするようにできると思います。