環境:WinXp(SP2) VC++.net2005 MFC
500個程度のデータを読み込み、値をXY座標上にプロットし(データ間は直線で結
ぶ)、データの分布を確認するアプリを作っています。
プロットする点(小さい塗り潰し円)を暗い色にし、他の点と重なった部分は、
重なった回数によって明るい色にするような処理は可能なのでしょうか?
データ間を結ぶ直線も同様に可能でしょうか?
例えば、基本はRGB(1,1,1)の色にして、他と重なった部分はRGB(2,2,2)、
更に重なればRGB(3,3,3)で、最も重なった所は、RGB(255,255,255)で表示する。
要するに、分布が集中している所は明るい色で、分散している所は暗い色で表示したい。
出来そうであれば、ヒントでも構いませんので、お教え願います。
できます。
どうやって実現するかも明らか。
ヒストグラム(度数分布表)を作れば解決。
できるのは間違いないけど、仕様によっては苦労するかも。
小さい塗り潰し円は、ベン図のように重なりますか?
直線の色は?
円は離散的で、2つの円はぴったり重なるか、全く重ならないかの
どちらかの状態しかないならば、επιστημη さんの方法で
比較的簡単に作れるでしょう。
そうでないなら(ベン図のように重なるならば)、
CRgnを使ったラスターオペレーションがいいかな、とも思うけど、
最も重なった部分を特定の色で表示したいなら、
最後に、色の補正をしないといけないみたい。
お返事ありがとうございます。
小さい塗り潰し円は、ベン図のように重なります。
直線の色は、小さい塗り潰し円と同じです。(色は何でもOK)
円の重なる程度によって、色の明暗を256段階で変えようと考えましたが、
複雑に重なり合うので、やはり難しそうですね。
2次元のグラフを、3次元的に表現できたらいいなって思ったのですが・・・。
どうするか、もう少し考えてみます。
ドットレベルで考えるのはどうでしょう、ゴリ押しですが、、、
よく考えれば、もっといいアルゴリズムがあるかもしれません。
# 起点(0,0座標)は考慮してません
----------------------------------------
#define MAX_X 512 // グラフの最大X座標
#define MAX_Y 512 // グラフの最大Y座標
void SetDataToColorLevel( ・・・ ){
// ドットのカラーレベル
int ColorLevel[MAX_X][MAX_Y] = { 0 };
// 塗りつぶし円の座標(内接円)、とりあえずRECT構造体で表現、、、
RECT rect;
// データ件数分ループ
for( ・・・ ){
// データを1件読込み、座標をrectへ格納
・・・
// rect内接円のColorLevelを上げる
POINT SerchPoint;
for( int i = rect.left; i < rect.right; i++ ){
for( int j = rect.top; j < rect.buttom; j++ ){
SerchPoint.x = i;
SerchPoint.y = j;
if( IsOnCircle( rect, SerchPoint ) ){
// SerchPointが円上にあれば、
// 対応する座標のColorLevelを上げる
ColorLevel[i][j]++;
}
}
}
}
// あとはColorLevelに従い、色を指定した点を描画していく
・・・
}
// point が rectに内接する円の上にあるか調査する
// あればTrue、なければFalse を返却
bool IsOnCircle( RECT rect, POINT point ){
// ここが一番めんどくさいかも
・・・
}
お返事ありがとうございます。
確かにドットレベルで考えるのが良いかも知れませんね。
分かり易いソースも書いて頂き感謝です。
この方法で考えてみます。
ドットレベルで考えて、何とか出来たのですが、
処理時間が長くなり過ぎてしまいました。
いろいろ調べて、GDI+を使ってみたら簡単に出来ました。
ありがとうございました。^^