画像を回転表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アボボ

画像を回転表示

#1

投稿記事 by アボボ » 9年前

どうもはじめまして
画像を回転し表示したいのですがうまくいきません。
DrawRotaGraphと同じような回転画像を表示するアルゴリズムを教えていただきませんでしょうか

実行時の画面
画像
一番左:オリジナルの画像
真ん中:DrawRotaGraphで回転し表示
一番右:自分で回転画像を表示

コード:

#include "DxLib.h"
#include "Math.h"

#define PI	3.1415926535897932384626433832795f
#define RAD(X) ((PI / 180.0f) * X)

// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
						LPSTR lpCmdLine, int nCmdShow )
{
	SetOutApplicationLogValidFlag(FALSE);

	if(ChangeWindowMode(TRUE) != DX_CHANGESCREEN_OK)
	{
		return -1;
	}

	if( DxLib_Init() == -1 )		// DXライブラリ初期化処理
	{
		return -1 ;			// エラーが起きたら直ちに終了
	}

	int GHandle = LoadGraph( "test.bmp" ) ;

	float rad = 45;
	
	float c = cos(RAD(-rad));
	float s = sin(RAD(-rad));

	int w;
	int h;

	GetGraphSize(GHandle, &w, &h);
	
	int x1, y1, x2, y2;
	int int_cos, int_sin;

	int DstW, DstH;
	int DstCx, DstCy;
	int SrcCx, SrcCy;

	SrcCx = (int)(w / 2.0f);
	SrcCy = (int)(h / 2.0f);

	////出力画像の幅高さを計算
	DstW = (int)( fabs(w * c) + fabs(h * s) + 0.5 );
	DstH = (int)( fabs(w * s) + fabs(h * c) + 0.5 ); 

	DstCx = DstW / 2;
	DstCy = DstH / 2;
	
	int_cos = (int)(c * 1024);
	int_sin = (int)(s * 1024);

	// 描画先画面を裏にする
	SetDrawScreen( DX_SCREEN_BACK ) ;

	while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
	{
		// 画面を消去
		ClearDrawScreen() ;

		DrawGraph( 0 , 0 , GHandle , TRUE ) ;

		for(y2 = 0; y2 < DstH; y2++)
		{
			for(x2 = 0; x2 < DstW; x2++)
			{
				// 出力画像の座標(nx, ny)から入力画像の座標(x, y)を逆算する
				x1 = (int)(((x2-DstCx) * int_cos - (y2-DstCy) * int_sin) >> 10) + SrcCx;
				y1 = (int)(((x2-DstCx) * int_sin + (y2-DstCy) * int_cos) >> 10) + SrcCy;
 
				if (x1 >= 0 && x1 < w && y1 >= 0 && y1 < h)
				{
					int col = GetPixel(x1, y1);
					DrawPixel(30 + x2, 0 + y2, col);
				}
				else
				{
					DrawPixel(30 + x2, 0 + y2, 0x0F0F0F);
				}
			}
		}
		
		// 読みこんだグラフィックを回転描画
		DrawRotaGraph( 20 , 3 , 1.0f , RAD(45) , GHandle , TRUE ) ;

		// 裏画面の内容を表画面に反映させる
		ScreenFlip() ;
	}

	DxLib_End() ;				// DXライブラリ使用の終了処理

	return 0 ;				// ソフトの終了 
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 画像を回転表示

#2

投稿記事 by softya(ソフト屋) » 9年前

少なくとも今の方法では、ハードウェア(GPU)で回転するDrawRotaGraph()とでは数万倍の速度差が出るのでやめたほうが良いと思います。
なぜ自分で回転させる必要があるのか教えてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゲスト

Re: 画像を回転表示

#3

投稿記事 by ゲスト » 9年前

やりたいことはシューティングなどの敵コリジョンエリアを
四角で表示したいです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: 画像を回転表示

#4

投稿記事 by softya(ソフト屋) » 9年前

DrawLine()で任意の4点を結べば回転する線だけの四角を描けますが、それでは代用にならないのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゲスト

Re: 画像を回転表示

#5

投稿記事 by ゲスト » 9年前

DrawLineでやってみたのですが
四角の画像をDrawRotaGraphで回転したように表示されませんでした。

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 画像を回転表示

#6

投稿記事 by みけCAT » 9年前

このサイトが参考になりますか?
http://homepage2.nifty.com/tsugu/sotuke ... .html#0016
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ゲスト

Re: 画像を回転表示

#7

投稿記事 by ゲスト » 9年前

明日、教えてくれたサイトを参考にしてプログラミングしてみますね。
ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る