トップ回答者
グラフを表示する

質問
-
Visual C++初心者のsentakumonoと申します。
センサとPCを通信させて,得られたデータをグラフ表示させるアプリケーションの作成について,ご質問です。
書店で販売されています関連書籍には,棒グラフや折れ線グラフといったものは見かけますが,
グラフ(3次元のものを2次元化したグラフ)表示に関する掲載が少なく,
参考となります資料を探しております。
データの計時変化を重ね書きの要領で可視化したいと考えていますが,
書籍等,参考となります情報がありましたら,ぜひ,お知らせ願います。- 編集済み sentakumono 2009年8月22日 5:09
回答
-
外池と申します。お話を伺っていて、おそらく2つ、あるいは3つのステップに分けて考える必要があるようにお見受けしました。
1) まず、表示するデータは計測データそのままではなくて、「補間」して作成しないといけないわけですよね? ここだけでも、イロイロと検討の余地があろうかと思います。単純な線型補間で「ギザギザ/トンガリ」な感じの山・谷の表現で良いのか、滑らかな曲線にしたいのか、などなどです。この辺りの方針が決まって、補間のアルゴリズムを調べたいならば、「描画」よりも、数値計算の書籍をご覧になることをお奨めします。基本的な「補間」アルゴリズムは大抵の数値計算の書籍に載っていますので。
2) 次に、出来上がった補間済みデータをどのように描画するか、ですが、これも、事前に検討しておくべきことがあろうかと思います。「縦横」とおっしゃっている計測位置の示す軸は、「固定」します? それとも、操作者の希望に応じて、平面方向に回転できるようにします? と言いますのも、表示は、ワイヤーフレームのような線画にするか(本来隠れるところも透視できるが複雑な形状になると判読が難しい)、ソリッドな面の描写にするか(隠れたところは見えなくなる。そこを見たければ視点を変更できるようにしなければならない)、それとも、中間的な半透明の描写にするか(隠れたところも見えるが、やはり複雑な形状だと判読しにくい・・・。いずれにせよ視点の変更は必要かも)などなどです。これらの手法の原理的なことを説明した書籍は、コンピューター・グラフィクスの教科書を見れば、大抵書いてあります。
3) ただ、教科書で原理がわかってもプログラムに全部書き下すのはかなり大変な作業だと思います。もしかすると、Direct 3DのようにWindowsの3次元描写の機能を使うことになるかもしれませんが、それはそれで、ドキュメントを調査することになろうかと思います。
こうやってみると、やはり3つのステップでしょうか・・・。実のところ「入門書」というレベルでは、これらの書籍は難しいかもしれません。
(ホームページを再開しました)- 回答としてマーク sentakumono 2009年8月24日 16:56
- 回答としてマークされていない sentakumono 2009年8月24日 17:16
- 回答としてマーク sentakumono 2009年8月24日 17:17
-
センサーからのデータは,インプットツールといったような市販の機器を介して,入力しています。
VC++初心者と書かれていますが、そもそも何処までの知識をお持ちなんでしょう?
その機器に付属のドライバによって,計測値を表示することは可能でした。
ただ,3次元グラフということになりますと,
分析用のアプリケーションが別途必要なようで,VCで自作してみようと考えています。
ちなみにイメージしているグラフとは,3つの軸に,高さ:計測値,縦横:計測位置をプロットし,
離点した点を補間して,グラフを描画したいと考えています。
入門書を書店で見ていますが,描画に関する記載が少ないな…という印象でして,ご質問しました。
調べ方に問題がありそうですね。もう少し,あたってみます。
これによってレスを書く側で考慮しないといけない内容がかなり変わってきます。
たとえば、C++言語に関しては既に知識があって自分でクラスを作成して利用する位の事まで
出来ているならC++言語に関しては分かっている前提で話が出来ます。
できれば、自分が理解している範囲について具体的に書いておくと状況にあったアドバイスを
得られる可能性が高くなると思います。
足りない部分がWindows上で動作するGUIアプリケーションの作成方法だけなら
お勧めする書籍の内容も変わってくると思いますよ。
C++言語その物を良く知らないなら言語の勉強からお勧めするでしょうし。
Windowsでグラフィックス描画に関して調べると、GDIで地道に計算して対応するとか、
DirectXやOpenGLを使って3Dを意識した描画ライブラリで対応するかとか幾つかの方法論が出来てきます。
概念的な部分に関してはGDIの方が直感的に理解しやすいと思いますが、3D用のライブラリでは無いので
自分で3Dを2D上で表現する為の座用計算が必要になるでしょう。
逆にDirectX等の3D描画ライブラリを使用する場合は概念を理解する必要がありますが、
必要な演算はライブラリの機能で賄えるという事になるでしょう。
実際にひとつのアプリケーションを作成する場合に一冊の本だけみれば何とかなると言うのは
稀な話で単機能のツール開発でもない限りは複数の書籍や多種多様のWeb上の情報を組み合わせて
解決する必要があります。そういう意味ではどういうキーワードで調べるかで得られる情報もかなり
変わってくると思います。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク sentakumono 2009年8月24日 17:09
-
老婆心ながら一言だけ。
MFCを使って開発されるのでしたらC++言語のクラスの概念と派生、仮想関数など、
オブジェクト指向に関する概念の理解は必須になります。
この部分を理解していないとMFCは使いこなせませんので、
もしMFCを使って開発をするおつもりならC++言語の文法周りの勉強をされた方が良いです。
クラスや派生等のオブジェクト指向の概念はC言語には無かった部分ですので
C言語とは設計等のアプローチも変わってきます。
また、MFCの利用に関してはクラスの派生や仮想関数、関数のオーバーライド等が
当たり前のように出てきますのでいきなりMFCを使うのではなくて、
純粋なC++言語の勉強をして自分でクラスを作って派生させて使う事ができる程度の
知識はあった方が良いです。この部分の知識が足りないと結構苦労しますので
一見、回り道に見えてもC++言語の勉強をする事をお勧めします。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク sentakumono 2009年8月25日 7:35
すべての返信
-
ご回答ありがとうございました。
説明が不足しまして失礼致しました。
センサーからのデータは,インプットツールといったような市販の機器を介して,入力しています。
その機器に付属のドライバによって,計測値を表示することは可能でした。
ただ,3次元グラフということになりますと,
分析用のアプリケーションが別途必要なようで,VCで自作してみようと考えています。
ちなみにイメージしているグラフとは,3つの軸に,高さ:計測値,縦横:計測位置をプロットし,
離点した点を補間して,グラフを描画したいと考えています。
入門書を書店で見ていますが,描画に関する記載が少ないな…という印象でして,ご質問しました。
調べ方に問題がありそうですね。もう少し,あたってみます。 -
外池と申します。お話を伺っていて、おそらく2つ、あるいは3つのステップに分けて考える必要があるようにお見受けしました。
1) まず、表示するデータは計測データそのままではなくて、「補間」して作成しないといけないわけですよね? ここだけでも、イロイロと検討の余地があろうかと思います。単純な線型補間で「ギザギザ/トンガリ」な感じの山・谷の表現で良いのか、滑らかな曲線にしたいのか、などなどです。この辺りの方針が決まって、補間のアルゴリズムを調べたいならば、「描画」よりも、数値計算の書籍をご覧になることをお奨めします。基本的な「補間」アルゴリズムは大抵の数値計算の書籍に載っていますので。
2) 次に、出来上がった補間済みデータをどのように描画するか、ですが、これも、事前に検討しておくべきことがあろうかと思います。「縦横」とおっしゃっている計測位置の示す軸は、「固定」します? それとも、操作者の希望に応じて、平面方向に回転できるようにします? と言いますのも、表示は、ワイヤーフレームのような線画にするか(本来隠れるところも透視できるが複雑な形状になると判読が難しい)、ソリッドな面の描写にするか(隠れたところは見えなくなる。そこを見たければ視点を変更できるようにしなければならない)、それとも、中間的な半透明の描写にするか(隠れたところも見えるが、やはり複雑な形状だと判読しにくい・・・。いずれにせよ視点の変更は必要かも)などなどです。これらの手法の原理的なことを説明した書籍は、コンピューター・グラフィクスの教科書を見れば、大抵書いてあります。
3) ただ、教科書で原理がわかってもプログラムに全部書き下すのはかなり大変な作業だと思います。もしかすると、Direct 3DのようにWindowsの3次元描写の機能を使うことになるかもしれませんが、それはそれで、ドキュメントを調査することになろうかと思います。
こうやってみると、やはり3つのステップでしょうか・・・。実のところ「入門書」というレベルでは、これらの書籍は難しいかもしれません。
(ホームページを再開しました)- 回答としてマーク sentakumono 2009年8月24日 16:56
- 回答としてマークされていない sentakumono 2009年8月24日 17:16
- 回答としてマーク sentakumono 2009年8月24日 17:17
-
センサーからのデータは,インプットツールといったような市販の機器を介して,入力しています。
VC++初心者と書かれていますが、そもそも何処までの知識をお持ちなんでしょう?
その機器に付属のドライバによって,計測値を表示することは可能でした。
ただ,3次元グラフということになりますと,
分析用のアプリケーションが別途必要なようで,VCで自作してみようと考えています。
ちなみにイメージしているグラフとは,3つの軸に,高さ:計測値,縦横:計測位置をプロットし,
離点した点を補間して,グラフを描画したいと考えています。
入門書を書店で見ていますが,描画に関する記載が少ないな…という印象でして,ご質問しました。
調べ方に問題がありそうですね。もう少し,あたってみます。
これによってレスを書く側で考慮しないといけない内容がかなり変わってきます。
たとえば、C++言語に関しては既に知識があって自分でクラスを作成して利用する位の事まで
出来ているならC++言語に関しては分かっている前提で話が出来ます。
できれば、自分が理解している範囲について具体的に書いておくと状況にあったアドバイスを
得られる可能性が高くなると思います。
足りない部分がWindows上で動作するGUIアプリケーションの作成方法だけなら
お勧めする書籍の内容も変わってくると思いますよ。
C++言語その物を良く知らないなら言語の勉強からお勧めするでしょうし。
Windowsでグラフィックス描画に関して調べると、GDIで地道に計算して対応するとか、
DirectXやOpenGLを使って3Dを意識した描画ライブラリで対応するかとか幾つかの方法論が出来てきます。
概念的な部分に関してはGDIの方が直感的に理解しやすいと思いますが、3D用のライブラリでは無いので
自分で3Dを2D上で表現する為の座用計算が必要になるでしょう。
逆にDirectX等の3D描画ライブラリを使用する場合は概念を理解する必要がありますが、
必要な演算はライブラリの機能で賄えるという事になるでしょう。
実際にひとつのアプリケーションを作成する場合に一冊の本だけみれば何とかなると言うのは
稀な話で単機能のツール開発でもない限りは複数の書籍や多種多様のWeb上の情報を組み合わせて
解決する必要があります。そういう意味ではどういうキーワードで調べるかで得られる情報もかなり
変わってくると思います。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク sentakumono 2009年8月24日 17:09
-
老婆心ながら一言だけ。
MFCを使って開発されるのでしたらC++言語のクラスの概念と派生、仮想関数など、
オブジェクト指向に関する概念の理解は必須になります。
この部分を理解していないとMFCは使いこなせませんので、
もしMFCを使って開発をするおつもりならC++言語の文法周りの勉強をされた方が良いです。
クラスや派生等のオブジェクト指向の概念はC言語には無かった部分ですので
C言語とは設計等のアプローチも変わってきます。
また、MFCの利用に関してはクラスの派生や仮想関数、関数のオーバーライド等が
当たり前のように出てきますのでいきなりMFCを使うのではなくて、
純粋なC++言語の勉強をして自分でクラスを作って派生させて使う事ができる程度の
知識はあった方が良いです。この部分の知識が足りないと結構苦労しますので
一見、回り道に見えてもC++言語の勉強をする事をお勧めします。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク sentakumono 2009年8月25日 7:35
-
携帯から書き込みできないここは、返答が遅れています。
まず、先の返答の意図です。sentakumonoさんがなされた質問には、3つの質問が含まれていると思います。3つを一度に行うのではなく、一つ一つ別個に調査、質問されてはいかがでしょうか。
プログラムを書くという仕事は、「したいこと」に対して、「どのように実現するか」を考えることです。「どのように実現するか」を考えるには、「しなければならないこと」を細かく分け、一つ一つのしなければならないことにたいして、「どうしたら実現できるか」を考えなければなりません。
今、「センサーからデータを取り込んで、グラフ表示をする」という「したいこと」があります。この中から、しなければならないことを見つけます。ひとつは、「センサーからデータを取り込む」。ひとつは、「取り込んだデータをグラフ化する」。ひとつは、「描いたグラフを、時間経過と共に変化させる」。この3つではないでしょうか。
3つの大きな「しなければならないこと」が出来ました。次は、このしなければならないことを「したいこと」として、また分解します。「センサーからデータを取り込む」については、センサーに付属のプログラムを応用すれば出来るということです。ですから、他の「しなければならないこと」を見ます。「取り込んだデータをグラフ化する」には、どうすればいいでしょう。まず、軸が表すものを決めます。y軸が「値」、x軸が「観測地点」ですね。次に、データの精度と、軸の精度の関係を決めます。例えば、y軸に200ピクセルを割り当てるとします。値として観測される範囲がどれくらいだから、1ピクセルが値いくらになる、と。x軸も同じ。このように、今わかっているものから求められるものを順に求めていきます。
しかし、自力で描くよりも、Grape City 社さんの TrueChart、LightStone 社さんの ORIGIN8 など、外部のコンポーネントを使うことを検討した方がいいかもしれません。
Jitta@わんくま同盟