いつもお世話になります。
下記ソースにてビットマップの回転を実現させようとしております。
ソースの一部ですので処理概要を説明すると、
まず、編集用画像領域をimage[][]に格納しておいて、
バッファでデータのやり取りをしており、下記ソースで演算後、
BitBltしております。
そこで、三角関数の処理に公式を利用しているのですが、
どうも左回転してしまいます。右回転したいので
安直に下記RotX・RotYを入れ替えたら右回転したんですけど、
実際の表示位置とは反転してしまいます。
数学的な話だと思うのですが、正常に右回転する方法を
ご存知の方、ご教授よろしくお願い致します。
開発環境はVC++6.0MFCです。
for (y = 0 ; y<Height ; y++) { //オリジナル針のY方向
for (x=0 ; x<Width ; x++) { //オリジナル針のX方向
double IncreX=x-2.5; //針中心からのベクトル
double IncreY=y-31.5;//針中心からのベクトル
double RotX= IncreX*::cos(m_dSAngle)-IncreY*::sin(m_dSAngle);
double RotY= IncreX*::sin(m_dSAngle)+IncreY*::cos(m_dSAngle);
long Offset = long(50.0+RotY) * 100 + long(50.0+RotX);
ASSERT(Offset<100*100);
*(buf+Offset)=image[y][x];
}
}
No.2ベストアンサー
- 回答日時:
他のソースが見えないので何とも言えませんが、多分ここのところが問題なんだと思いますのでアドバイスさせて頂きます。
DIBでの画像データは左下がオフセットとなり、右方向へなめて一段上へ・・・このように格納されています。
これを理解せずに回転しようとすると、反対方向へ回転しますので、DIBをバイナリレベルで扱う場合は注意してください。
image[0][0]は画像左下の座標なので、y座標の考え方を根本から反転してください。表示位置に影響が出たのはそのためだと思われます。
*DDサーフェイスはちゃんと左上が頂点ですが、過去の解答を見る限りDIBですよね?
また、オリジナル側の画像を参照して回転すると、斜線がガタガタになったり、画像に穴ができたりします。
根本的な対策は、ここで言うところのbuf側から全部の座標を埋めていく事です。
※ここで複数の座標を参照すれば綺麗な中間色が出せます。が、重い・・・
ソースは御自身で作成できると思いますので、頑張ってください。このままでよろしければ、yのあたりをチョコッと直せば済む筈です。
*私はWin32ベース(というか、こういう細かい部分はasm)で作るので、MFCベースのソースはちょっと・・なので。投げやりでごめんなさい。
また、回転拡大縮小はAPIに任せた方が楽だと思いますよ?
結局キャッシュミスが起こるので、アセンブラで作成しても大差ないです。
尚、参照URLの方が的確なアドバイスが選られると思います。
ご参考まで。
参考URL:http://www.bio100.co.jp/
No.1
- 回答日時:
角度の測り方は反時計回りが標準ですから、普通にやったのでは左回転
するでしょうね。
で、時計回りにするには、簡単です。角度をマイナスにすれば良いのです。
ご質問の例ではm_dsAngleを(-m_dsAngle)で入れ替えればよいことになります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
3次元空間上の2つの座標から...
-
ピクチャボックスの座標取得
-
一番近い点を見つけたい。
-
閉図形の座標の配列が右回りか...
-
ExcelやAccessで社内の端末の配...
-
VB.NETでPictureBox間で論理演算
-
座標を持った平面範囲に座標を...
-
シーケンサー(PLC?)で制...
-
画像の円形内による画素検出に...
-
ピクセル座標で2点間の直線上...
-
選択範囲の座標値の抽出
-
C++でコマンドプロンプトに図形...
-
変数の表示
-
複数コントロール(ラベル)を...
-
始点、終点の二つの座標と半径...
-
3D→2Dの座標変換で、スクリーン...
-
タッチパッドのタッチ座標取得
-
ベクトルを使った関数
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
グラフの交点の求め方(Excel)
-
マインクラフト(pc版)で座標...
-
以下のプログラムは重心を求め...
-
ダイアログ内コントロールの位...
-
3次元空間上の2つの座標から...
-
エクセルである点からの距離で...
-
エクセルで回転する座標の出し方
-
シーケンサー(PLC?)で制...
-
C言語 配列で座標
-
始点、終点の二つの座標と半径...
-
閉図形の座標の配列が右回りか...
-
一番近い点を見つけたい。
-
ワード上Shapeの位置情報を統一...
-
最小二乗平面
-
多角形の内部かどうか判定する方法
-
タッチパッドのタッチ座標取得
-
Excel VBA で自在に図形を変化...
-
座標を持った平面範囲に座標を...
-
ピクチャボックスの座標取得
-
DirectInputでの現在のマウス座...
おすすめ情報