トップページ > 過去ログ > 記事閲覧
自由変形について
名前:ロッカー 日時: 2010/01/12 09:46

こんにちは。 2次元画像の変形処理を考えており、 いろいろ調べているうちに、ここにたどり着きました。 DrawModiGraphという関数で、四角形の自由変形が行えるようですが、 この関数は、変形前画像は長方形(四角形の内角がすべて90度)でないと駄目みたいですね。 私がやりたいのは、 コピー元画像(変形前画像)内の任意の4点を選択し、その4点で構成される四角形を、 別の四角形に変形させて、 コピー先画像内の任意の位置に貼り付ける、 というものです。 そのようなことがDXライブラリでは可能でしょうか? ご教授よろしくお願いいたします。

Page: 1 |

Re: 自由変形について ( No.1 )
名前:Will 日時:2010/01/12 11:39

DerivationGraphで変形したい部分を新たなグラフィックとして作成し、それに対しDrawModiGraphすれば印ではないでしょうか。
Re: 自由変形について ( No.2 )
名前:ロッカー 日時:2010/01/12 13:50

回答ありがとうございます。 DerivationGraphを確認したところ、 長方形しか抜き出せないようです。 私がやりたいのは、 変形前の画像も、長方形ではなく、 ひし形だったり、向かい合う辺の長さが等しくなかったり、任意の四角形なのです。 任意の四角形と、別の任意の四角形に変形する方法です。 よろしくお願いします。
Re: 自由変形について ( No.3 )
名前:管理人 日時:2010/01/17 17:23

非公開関数の DrawPolygon を使用すれば実現できると思います // 2Dポリゴンを描画する int DrawPolygon( VERTEX *Vertex, // 描画するポリゴンを形成する頂点配列の先頭アドレス、PolygonNum * 3 個の長さが必要 int PolygonNum, // 描画するポリゴンの数 int GrHandle, // 描画する画像、幅・高さは2のn乗である必要があります int TransFlag // 透過色処理を使用するかどうか( TRUE:使用する FALSE:使用しない ) ) ; この関数では VERTEX という構造体を使用します struct VERTEX { float x, y ; // スクリーン座標 float u, v ; // テクスチャ座標 unsigned char b, g, r, a ; // 色 } ; テクスチャ座標で描画する画像のどの部分を使用するかを指定できます ただ、指定の仕方はピクセル単位ではなくて描画する画像の端から端までを 0.0〜1.0 で指定します こちらのサンプルでは「サンプルプログラム実行用フォルダ」の中に入っている TexAddrTransfTest.bmp( 左から順に64x64サイズの □○△× が描かれている画像 ) の□の部分だけを三角形ポリゴン二つを使用して描画しています よろしければご覧下さい #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { VERTEX Vert[ 6 ] ; int GrHandle, SizeX, SizeY ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 画像の読みこみ GrHandle = LoadGraph( "TexAddrTransfTest.bmp" ) ; // 画像の幅と高さを取得する GetGraphSize( GrHandle, &SizeX, &SizeY ) ; // ポリゴン二つ分の頂点データを初期化する // 左上の頂点( 一つ目のポリゴン ) Vert[ 0 ].x = 0 ; Vert[ 0 ].y = 0 ; Vert[ 0 ].u = 0.0f / SizeX ; Vert[ 0 ].v = 0.0f ; Vert[ 0 ].r = 255 ; Vert[ 0 ].g = 255 ; Vert[ 0 ].b = 255 ; Vert[ 0 ].a = 255 ; // 右上の頂点( 一つ目のポリゴン ) Vert[ 1 ].x = 64 ; Vert[ 1 ].y = 0 ; Vert[ 1 ].u = 64.0f / SizeX ; Vert[ 1 ].v = 0.0f ; Vert[ 1 ].r = 255 ; Vert[ 1 ].g = 255 ; Vert[ 1 ].b = 255 ; Vert[ 1 ].a = 255 ; // 左下の頂点( 一つ目のポリゴン ) Vert[ 2 ].x = 0 ; Vert[ 2 ].y = 64 ; Vert[ 2 ].u = 0.0f ; Vert[ 2 ].v = 64.0f / SizeY ; Vert[ 2 ].r = 255 ; Vert[ 2 ].g = 255 ; Vert[ 2 ].b = 255 ; Vert[ 2 ].a = 255 ; // 右下の頂点( 二つ目のポリゴン ) Vert[ 3 ].x = 64 ; Vert[ 3 ].y = 64 ; Vert[ 3 ].u = 64.0f / SizeX ; Vert[ 3 ].v = 64.0f / SizeY ; Vert[ 3 ].r = 255 ; Vert[ 3 ].g = 255 ; Vert[ 3 ].b = 255 ; Vert[ 3 ].a = 255 ; Vert[ 4 ] = Vert[ 2 ] ; // 左下の頂点をコピー( 二つ目のポリゴン ) Vert[ 5 ] = Vert[ 1 ] ; // 右下の頂点をコピー( 二つ目のポリゴン ) // ポリゴン二つを描画する DrawPolygon( Vert, 2, GrHandle, FALSE ) ; // キー入力待ち WaitKey() ; // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
Re: 自由変形について ( No.4 )
名前:ロッカー 日時:2010/01/20 02:54

ご丁寧な回答、ありがとうございます。 非公開関数までご教授いただき、恐縮です。 四角形を2つの三角形に分割し、 それぞれの変形を描画するわけですね。 これで、私のやりたいことが可能だと思います。 試してみたいと思います。 また質問させていただくかもしれませんが、 よろしくお願いいたします。

Page: 1 |