いつもお世話になります。

下記ソースにてビットマップの回転を実現させようとしております。
ソースの一部ですので処理概要を説明すると、
まず、編集用画像領域を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];
 }
}

A 回答 (2件)

他のソースが見えないので何とも言えませんが、多分ここのところが問題なんだと思いますのでアドバイスさせて頂きます。



DIBでの画像データは左下がオフセットとなり、右方向へなめて一段上へ・・・このように格納されています。
これを理解せずに回転しようとすると、反対方向へ回転しますので、DIBをバイナリレベルで扱う場合は注意してください。
image[0][0]は画像左下の座標なので、y座標の考え方を根本から反転してください。表示位置に影響が出たのはそのためだと思われます。
*DDサーフェイスはちゃんと左上が頂点ですが、過去の解答を見る限りDIBですよね?

また、オリジナル側の画像を参照して回転すると、斜線がガタガタになったり、画像に穴ができたりします。
根本的な対策は、ここで言うところのbuf側から全部の座標を埋めていく事です。
※ここで複数の座標を参照すれば綺麗な中間色が出せます。が、重い・・・

ソースは御自身で作成できると思いますので、頑張ってください。このままでよろしければ、yのあたりをチョコッと直せば済む筈です。
*私はWin32ベース(というか、こういう細かい部分はasm)で作るので、MFCベースのソースはちょっと・・なので。投げやりでごめんなさい。

また、回転拡大縮小はAPIに任せた方が楽だと思いますよ?
結局キャッシュミスが起こるので、アセンブラで作成しても大差ないです。

尚、参照URLの方が的確なアドバイスが選られると思います。
ご参考まで。

参考URL:http://www.bio100.co.jp/
    • good
    • 0

角度の測り方は反時計回りが標準ですから、普通にやったのでは左回転


するでしょうね。
で、時計回りにするには、簡単です。角度をマイナスにすれば良いのです。
ご質問の例ではm_dsAngleを(-m_dsAngle)で入れ替えればよいことになります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q添付画像のファイルはどんな状態のファイルなのでしょうか?クリってもエラ

添付画像のファイルはどんな状態のファイルなのでしょうか?クリってもエラーしか出た事がないのですが

Aベストアンサー

他の回答者様の記入通り、拡張子が無い事には判断出来ません。
また、クリックしてもエラーとありますが、webから探すとか出ませんか?
憶測ですが、多分質問者様のPCにこのファイルを開くアプリケーションが
インストールされていないのではないかな?って思います。
参考までに
よくありがちなのは、XPで作ったエクセルファイル等(逆だったかな^^;)を
ビスタのPCで見ると似たようなアイコンになります。
オフィスの互換パックをインストールすると見れます。

Q double (*foo)(double);

 double (*foo)(double);
C のコードで上のように宣言されたとき,foo は何を表していますか?

プログラミング初心者です.
よろしくお願いします.

Aベストアンサー

関数ポインタですね。
状態変数等によって呼び出し関数を変える時に、関数ポインタのテーブルを引っ張ってきて呼び出したりすることがあります。

double (*foo[])(double) = {func1, func2, func3};

とかあった場合
int idx = 1;
double param = 1.1;
double ret;
ret = (*foo[idx])(param);

とすれば

ret = func2(param);

とするのと同じことです。

Q右クリで画像保存が出ない!

画像を取りたくて矢印を画像に置くと!手のマークに代わり!右クリができなくなりました。
どうしたらよいのでしょうか?

Aベストアンサー

最近のサイトでは著作権の問題もあり、勝手に保存ができないように右クリックができないように設定しいるところが多くなっているであります。法律に抵触する場合もあるであります。

方法としては、色々あるでありますが、ただ見えてる画像が欲しいのであれば、プリントスクリーンでPC画面全体をコピーして、ペイントソフトにペースト、余分な部分を削除して保存すればいいと思うであります。

プリントスクリーンはググってほしいであります。

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Q 友近さんの画像を探しています。本当にいい人で、美人で、セクシーだと思

 友近さんの画像を探しています。本当にいい人で、美人で、セクシーだと思います。着衣・水着・スカート、なんでもOKです(あまり小さいサイズじゃない方がよいです)。どうぞよろしくお願いします。

Aベストアンサー

こちらに数点ありました。
http://bsearch.goo.ne.jp/image.php?UI=web&TAB=web&STYPE=0&CC=1&SCRDEF=0&IMGST=0&IMGSZ=0&IMGC=3&IMGFT=0&IMGFT=1&IMGFT=2&IMGFT=3&MOVPT=0&MOVFT=0&MOVFT=1&MOVFT=2&MOVFT=3&AUDPT=0&NSDP=1&KWDP=1&DC=20&FR=1&SM=mc&OCR=1&SITE=&SITE2=&SITE3=&SITE4=&SITE5=&SITEH=&AUDST=0&AUDMST=0&MOVTHN=0&QGR=1&MOVSC=0&NOJSB=0&QGA=1&NOJS=0&AUDSITE=0&MT=%CD%A7%B6%E1&button=%B2%E8%C1%FC%B8%A1%BA%F7
画像を使用される場合は自己責任でお願いします。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

Q●「美人アプリ」の画像を保存したい!

●「美人アプリ」というアプリを使用しています。

●ここで表示される画像を保存したいのですが、方法がわかりません。可能かどうかも。。

●もし、方法をご存知の方がいらっしゃいましたら教えていただけませんか?おねがいします。

Aベストアンサー

保存したい画像を表示させて、↓の方法で画面をキャプチャすると、写真アルバムから見れます。
http://blog.livedoor.jp/sakusakupocky/archives/50263981.html

Qfor(s=p; *p; p++)の*p(ポインタ)の意味

for(s=p; *p; p++)の*p(ポインタ)の意味
C言語初心者です。
今ポインタを勉強しているのですが、
for文で上記のようなものが出てきて、意味が分からず困っています。
*pで*p != NULL と同じような意味になるみたいなのですが…。
どうしてそのような意味になるのでしょうか?

ちなみにsとpはポインタで、
sには配列(入力した文字列)の先頭アドレスが入っています。
pは文字列を指していて○○○○○NULL ←になるから上記のような条件で
回るんだろうなぁとはなんとなく考えているのですが。

Aベストアンサー

念のため:
ヌルポインタは「ビットパターンとして」0 じゃないかもしれませんが, ソースプログラムにおいて「ポインタが要求される場面」で「0」とあれば, それは「ヌルポインタ」です.
もうちょっと厳密に書くと「整定数 0」はヌルポインタに変換される.

Q右クリ禁止のサイトの画像を保存

質問の通りなのですが右クリック禁止のサイトの画像を保存できるようにする方法はないでしょうか?あと、よく海外でおもしろ動画とかを見せてるサイトがありますが、そういった動画を保存する方法はありますか?重ねて質問すいません^^;

Aベストアンサー

そのサイトを見ないとなんとも言えませんが、
JAVAをオフにしてみると右クリック禁止がはずれる事もあります。

それで駄目ならば、プリントスクリーンを取って画像を修正してください。
まぁ画像を持ち出されたくないサイトならばあまり持ち出さないほうがよろしいかと思います。

ちなみに動画を保存する場合は専用のソフトなどが必要。

Qif((double)a >= (double)b))

初歩的な質問ですいません。

SetTani(char* text, double x)
{
 BOOL test = FALSE;
 double tmp = x;
 double tmp1 = 1000.000;
 if(x < 0){//もしもマイナスだったらプラスにする
  tmp = fabs(tmp);
  test = TRUE;
 }
 if(tmp >= tmp1){//ここで問題が発生
   ・
   ・
   ・
 }

xに-1000が入ってきた時に問題が発生します。
絶対値を求めたあとのif文ではじかれてしまいます。
デバッグモードでみてみても
tmp 1000.000000
tmp1 1000.000000
となっているのになぜ
if(tmp >= tmp1)
がTRUEとならないのでしょうか?
ちなみにxに1000が入ってきたときは
tmp 1000.000000
tmp1 1000.000000
となっていて
if(tmp >= tmp1)がTRUEとなります。

よろしくお願いします。

初歩的な質問ですいません。

SetTani(char* text, double x)
{
 BOOL test = FALSE;
 double tmp = x;
 double tmp1 = 1000.000;
 if(x < 0){//もしもマイナスだったらプラスにする
  tmp = fabs(tmp);
  test = TRUE;
 }
 if(tmp >= tmp1){//ここで問題が発生
   ・
   ・
   ・
 }

xに-1000が入ってきた時に問題が発生します。
絶対値を求めたあとのif文ではじかれてしまいます。
デバッグモードでみてみても
tmp 1000.000000
tmp1 1000.000000
となっているのにな...続きを読む

Aベストアンサー

多分、実数の誤差に起因する問題でしょう。変数のウォッチ(VC を使ってる?)では
なく、問題の箇所の直前に、以下のような文を追加して、変数の内容を確認してみて下さい。

printf("tmp = %40.30f, tmp1 = %40.30f\n", tmp, tmp1);


多分、内容が違っているはず。

質問にある「 x に -1000 が入ってきたとき」というのは、直接 x に -1000 を代入
したのではなく、float の変数を使った演算の結果だったりしませんか?


人気Q&Aランキング

おすすめ情報