画像の座標軸の反転
(例)右にAという画像があったら左にAという画像を移動させる
上にBという画像があったら下にBという画像を移動させる
方法が私にはわからないので教えていただけますか?
できればプログラムまで載せて頂けると幸いです。
お願いいたします。
わからないのは方法ですか?それともやりたいことですか?
右とか左とか、何と比較してでしょうか?
具体的に書けませんか?
アフィン変換の操作にあるミラー写像を用いればできると思われます。
画像ではありませんが、CView::OnDraw()内でのサンプル。
----- BEGIN CHogehogeView::OnDraw() -----
CRect rc;
GetClientRect(&rc);
XFORM xf;
xf.eM11 = (FLOAT)-1;
xf.eM12 = (FLOAT)0;
xf.eM21 = (FLOAT)0;
xf.eM22 = (FLOAT)1;
xf.eDx = (FLOAT)rc.Width();
xf.eDy = (FLOAT)0;
::SetGraphicsMode(pDC->GetSafeHdc(), GM_ADVANCED);
::SetWorldTransform(pDC->GetSafeHdc(), &xf);
pDC->MoveTo(0, 0);
pDC->LineTo(500, 500);
pDC->TextOut(-0, 0, _T(ミラー描画));
----- END CHogehogeView::OnDraw() -----
確か、GM_ADVANCEDがNT系列でしか使えなかったと思いますが、
そこは動作OSを限定する、ということで。
上記は文字サンプルですが、画像に対しても大丈夫だと思われます。
ちなみに、画像に対して反転をとる場合は、反転する画像と同領域の
コンパチビットマップを作成して、画像の幅をオフセットとしたミラー軸
とすることで、ミラー写像が得られると思われます。
アフィン変換の操作にあるミラー写像を用いればできると思われます。
画像ではありませんが、CView::OnDraw()内でのサンプル。
----- BEGIN CHogehogeView::OnDraw() -----
CRect rc;
GetClientRect(&rc);
XFORM xf;
xf.eM11 = (FLOAT)-1;
xf.eM12 = (FLOAT)0;
xf.eM21 = (FLOAT)0;
xf.eM22 = (FLOAT)1;
xf.eDx = (FLOAT)rc.Width();
xf.eDy = (FLOAT)0;
::SetGraphicsMode(pDC->GetSafeHdc(), GM_ADVANCED);
::SetWorldTransform(pDC->GetSafeHdc(), &xf);
pDC->MoveTo(0, 0);
pDC->LineTo(500, 500);
pDC->TextOut(-0, 0, _T(ミラー描画));
----- END CHogehogeView::OnDraw() -----
確か、GM_ADVANCEDがNT系列でしか使えなかったと思いますが、
そこは動作OSを限定する、ということで。
上記は文字サンプルですが、画像に対しても大丈夫だと思われます。
ちなみに、画像に対して反転をとる場合は、反転する画像と同領域の
コンパチビットマップを作成して、画像の幅をオフセットとしたミラー軸
とすることで、ミラー写像が得られると思われます。
orz
改行のつもりでリターンキーを押したらフォーカスが送信ボタンでした。
申し訳ない・・。m(__)m
(書きたかったこと)
たわいもない追記ですが、アフィン変換の詳細はググってください。
SetWorldTransform()でもそれなりに説明がでますし、Direct3Dあたりの
文献でもアフィン変換はよく出現しますので、その文献を参考にするのも
手です。
単純ミラーだけならば問題はないですが、回転・ミラー・平行移動などを
織り交ぜる予定があるなら行列の掛け算が必要となるハズです。
行列計算はWin32API上でサポートされないので、サポートライブラリ(D3Dなど)を
用いると手っ取り早いカモしれません。
# このあたりの詳細は詳しくないので、調べてください。
補足訂正です。
> 行列計算はWin32API上でサポートされないので、
直接的な行列計算はサポートされませんが、World変換に必要な計算部分は
ModifyWorldTransform()で可能でした。
// 回転 + 平行移動
::ModifyWorldTransform(pDC->GetSafeHdc(), 回転用の行列, MWT_RIGHTMULTIPLY);
::ModifyWorldTransform(pDC->GetSafeHdc(), 平行移動用の行列, MWT_RIGHTMULTIPLY);
...(DC描画)...
// 変換を無効にする (=単位行列の設定)
::ModifyWorldTransform(pDC->GetSafeHdc(), NULL, MWT_IDENTITY);
以下に具体的なのを見つけたよ
http://www.geocities.jp/ky_webid/win32c/023.html
StretchBltで左右反転しているみたいだ。
他にも検索すれば見つかるだろ。
座標指定をちょっと変えるだけだよ。
玲音 (st.lain) >様々な情報ありがとうございます。
たいちう>ディスプレイ上にA,B,と並んでいる画像があるとして、その画像をB、
Aという風に左右の位置を逆にしたいのですが、よくわからなくて悩んでいます。あと
上下にA,BとありましたらB,Aという風にもしたいと考えております。
まだVC++をはじめたばかりで専門用語がわからないので説明がへたですいませ
ん。。。
よくわからんから勘繰って回答する。
>ディスプレイ上にA,B,と並んでいる画像があるとして、
この時点ですでにあなたは
画像Aを左に描画し、画像Bを右に描画するプログラムを作成したか
あるいは
画像Aを表示しているピクチャコントロールを左に置き、
同様に右に画像Bを配置するプログラムを作成した
ことになりますよ。
そう感じてしまう。
あるいは別の方法かもしれないが俺にはそこまでわからない。
そう考えると
画像Aを右に描画し、画像Bを左に描画するプログラム
あるいは
画像Aを表示しているピクチャコントロールを―省略―
というプログラムは
そんなに悩まずに作れるはず。
そう考えると
あなたは
>ディスプレイ上にA,B,と並んでいる画像があるとして
すでにこれが出来ないのではないだろうか。
俺って失礼なこと勘繰ってしまうな。
>ディスプレイ上にA,B,と並んでいる画像があるとして、
もし、あなたが、これを既に作っているなら、具体的に示してくれ。
もし、あなたが、これを作りたいが作れないなら、これを先に解決しよう。
あるいは、それ以外なら、説明してくれ。
/*
質問するときに
最終的にやりたいことを最初に述べておくことはいいことです。
何処までできたか、何を調べたか、何がわからないか示すといいです。
*/