VCでScaleを変えるには?

解決


じんてい  2004-12-10 09:13:06  No: 55626

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

現在VCでグラフの作成をしているのですがデータ数が多すぎて
実際の表示領域では足りなくなってしまいました。
実際の描画領域が100×100ピクセルだとしてそれ以上(たとえば1000×1000)
の点や線を表示するのは無理でしょうか?

確かVBだとScaleメソッドを使えば簡単に変更できたと思うのですが
VCではどのようにすれば実現できるのでしょう?

お答えしていただける方がいましたらよろしくお願いしますm(__)m


なーめ  2004-12-10 19:44:15  No: 55627

単純に座標を1/10にして描画するだけです。


じんてい  2004-12-10 20:33:29  No: 55628

なーめさんご回答ありがとうございます。

座標データは計算せずそのままで描画処理の方で
どうにかなりませんか?

実際は縦350の領域にデータ範囲0〜70000のデータを
描画しないといけないんです。

今現在描画処理はなーめさんの言うとおり座標を除算し描画しているのですが
マウスで範囲選択された部分を拡大縮小をしなければいけないんです。
その場合スケールを変えるこができれば計算や描画範囲の管理がしやすいと
のでは。と思いまして(^^;)


なーめ  2004-12-10 21:59:06  No: 55629

SDK/MFC の区別、OS/VC++バージョンなどちゃんと書いてください。
SDI/MDI/Dialog なども。Webアプリかもしれませんしね。

考え様によっては、巨大なビットマップファイルを生成して
IE で縮小して表示する手もありそうですし。

スケールについて
CDC::SetMapMode() (MFC)
SetMapMode() (SDK)
をヘルプで引いてください。
ただ、
1/10 になった点の取り扱い(表示する/しない)に関して、
私はこれらの関数を信用しないので、自分で計算して描画することを
お勧めしますが。

描画先は直接ウィンドウか、一度ビットマップデータ
を構成してから BitBltかということもありますね。

後者の場合、BitBlt のかわりに StretchBlt で拡大/縮小する
というのもあります。これも(1/10)に関しては消える可能性が
9割ですね。

ちなみに、私は仕事でなければ、スクロールバーさえ、
調べるのが面倒になると自分で描画しますから。
そのほうが、デザイン(設計)が自由でしょう。
左バーでスクロール、右バーでスケールとか。


じんてい  2004-12-10 22:13:23  No: 55630

すみません(^^;)

環境はWindowsXp  VC++6.0  ダイアログベースです。

>1/10 になった点の取り扱い(表示する/しない)に関して、
>私はこれらの関数を信用しないので、自分で計算して描画することを
>お勧めしますが。

そうなんですよね(^^;)
構成としてはビットマップに一度落としてウィンドウに
貼り付けるという形をとっているんですけど
結局1/10などの問題がありますよね・・・。

今現在SetMapMode(MM_ANISOTROPIC)でマップモードを変えて
SetWindowExt・SetViewportExt関数なので試行錯誤したのですが
思いどおりにならなくて(^^;)

もう一度考え直してみます。

なーめさん貴重なご意見ありがとうございましたm(__)m


なーめ  2004-12-10 23:37:04  No: 55631

>> 結局1/10などの問題がありますよね・・・。
自分で描画することを前提に。
1/10 となるとデータの点の位置がユニークであるとしても 0-100個の
点が1点に集中しますよね。
点の色を黄色系として
1 点でもあれば 0x444400 (RGB)
40点以上       0x888800
60点以上       0xAAAA00
80点以上       0xFFFF00
といった形かな。
可変スケールならばスレッショルドも可変にしなければなりません。
>> ビットマップに一度落としてウィンドウ
メモリDCで CBitmap に
SetPixel で描画しているとしたら大分遅いでしょう。
BITMAPのラスタイメージのアドレスを計算して
そのピクセルにRGB値を書き込むのが高速です。
そして、
等倍でStretchDIBits()です。
結局ラスタイメージのアドレスを計算するので、
その計算式に、スケールファクタを加味するわけですよ。
だから生データを引数にする
Plot( double x, double y )
を1つまじめにつくればいいだけです。
1画面間性したら OnPaint() で StreatchDIBits()
CStatic など使わずに直接ダイアログに描画ですが。

DIBを扱うクラスを一つ作っておくと結構便利ですよ。

http://www.mip.sdu.dk/~edr/about_me/cdib_class.htm


じんてい  2004-12-11 00:12:24  No: 55632

>1/10 となるとデータの点の位置がユニークであるとしても 0-100個の

そういった考え方もあるんですね!
色を変えて表示とは思いつきませんでした(^^)

>SetPixel で描画しているとしたら大分遅いでしょう。
そうなんですよね(^^;)けっこう遅いんですよね(T-T)

>BITMAPのラスタイメージのアドレスを計算して
>そのピクセルにRGB値を書き込むのが高速です。
このやり方いいですね!是非参考にさせていただきます!!

なーめさん色々教えていただきましてありがとうございました。
教えていただいたことを参考にがんばってみます。m(__)m


なーめ  2004-12-11 00:53:07  No: 55633

>> 1画面間性したら 
1画面完成したら
なんという誤字。(; ;)
結構重要な一言に誤字とは...なさけない。


じんてい  2004-12-11 01:58:41  No: 55634

いえいえ。ちゃんと伝わってますし貴重なご意見が
聞けてありがたいです(^0^)

また機会がありましたらよろしくお願いしますm(__)m


じんてい  2004-12-13 19:33:35  No: 55635

ありがとうございましたm(__)m


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加