none
グラフを表示する RRS feed

  • 質問

  • Visual C++初心者のsentakumonoと申します。

    センサとPCを通信させて,得られたデータをグラフ表示させるアプリケーションの作成について,ご質問です。
    書店で販売されています関連書籍には,棒グラフや折れ線グラフといったものは見かけますが,
    グラフ(3次元のものを2次元化したグラフ)表示に関する掲載が少なく,
    参考となります資料を探しております。
    データの計時変化を重ね書きの要領で可視化したいと考えていますが,
    書籍等,参考となります情報がありましたら,ぜひ,お知らせ願います。
    2009年8月22日 5:04

回答

  • 外池と申します。お話を伺っていて、おそらく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
    2009年8月24日 1:18
  • センサーからのデータは,インプットツールといったような市販の機器を介して,入力しています。
    その機器に付属のドライバによって,計測値を表示することは可能でした。

    ただ,3次元グラフということになりますと,
    分析用のアプリケーションが別途必要なようで,VCで自作してみようと考えています。

    ちなみにイメージしているグラフとは,3つの軸に,高さ:計測値,縦横:計測位置をプロットし,
    離点した点を補間して,グラフを描画したいと考えています。

    入門書を書店で見ていますが,描画に関する記載が少ないな…という印象でして,ご質問しました。
    調べ方に問題がありそうですね。もう少し,あたってみます。
    VC++初心者と書かれていますが、そもそも何処までの知識をお持ちなんでしょう?
    これによってレスを書く側で考慮しないといけない内容がかなり変わってきます。
    たとえば、C++言語に関しては既に知識があって自分でクラスを作成して利用する位の事まで
    出来ているならC++言語に関しては分かっている前提で話が出来ます。
    できれば、自分が理解している範囲について具体的に書いておくと状況にあったアドバイスを
    得られる可能性が高くなると思います。

    足りない部分がWindows上で動作するGUIアプリケーションの作成方法だけなら
    お勧めする書籍の内容も変わってくると思いますよ。
    C++言語その物を良く知らないなら言語の勉強からお勧めするでしょうし。

    Windowsでグラフィックス描画に関して調べると、GDIで地道に計算して対応するとか、
    DirectXやOpenGLを使って3Dを意識した描画ライブラリで対応するかとか幾つかの方法論が出来てきます。
    概念的な部分に関してはGDIの方が直感的に理解しやすいと思いますが、3D用のライブラリでは無いので
    自分で3Dを2D上で表現する為の座用計算が必要になるでしょう。
    逆にDirectX等の3D描画ライブラリを使用する場合は概念を理解する必要がありますが、
    必要な演算はライブラリの機能で賄えるという事になるでしょう。

    実際にひとつのアプリケーションを作成する場合に一冊の本だけみれば何とかなると言うのは
    稀な話で単機能のツール開発でもない限りは複数の書籍や多種多様のWeb上の情報を組み合わせて
    解決する必要があります。そういう意味ではどういうキーワードで調べるかで得られる情報もかなり
    変わってくると思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク sentakumono 2009年8月24日 17:09
    2009年8月24日 7:39
  • 老婆心ながら一言だけ。

    MFCを使って開発されるのでしたらC++言語のクラスの概念と派生、仮想関数など、
    オブジェクト指向に関する概念の理解は必須になります。
    この部分を理解していないとMFCは使いこなせませんので、
    もしMFCを使って開発をするおつもりならC++言語の文法周りの勉強をされた方が良いです。
    クラスや派生等のオブジェクト指向の概念はC言語には無かった部分ですので
    C言語とは設計等のアプローチも変わってきます。

    また、MFCの利用に関してはクラスの派生や仮想関数、関数のオーバーライド等が
    当たり前のように出てきますのでいきなりMFCを使うのではなくて、
    純粋なC++言語の勉強をして自分でクラスを作って派生させて使う事ができる程度の
    知識はあった方が良いです。この部分の知識が足りないと結構苦労しますので
    一見、回り道に見えてもC++言語の勉強をする事をお勧めします。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク sentakumono 2009年8月25日 7:35
    2009年8月25日 0:08

すべての返信

  • センサーから、どのようにしてデータを取り込むのでしょうか。
    取り込んだデータを、どのようにグラフとして表示するのでしょうか。
    時間とともに変化するグラフを描画するのは、どのように行うのでしょうか。

    この3つの事が出来ればいいと思うのですが、どうでしょう?

    この3つがひとところにまとまっていることは、ほとんど無いと思います。
    しかし、一つ一つであれば、いたるところに情報があるでしょう。
    あるいは、掲示板ではそのものズバリな質問をいくつか目にしています。


    Jitta@わんくま同盟
    2009年8月23日 2:55
  • ご回答ありがとうございました。
    説明が不足しまして失礼致しました。

    センサーからのデータは,インプットツールといったような市販の機器を介して,入力しています。
    その機器に付属のドライバによって,計測値を表示することは可能でした。

    ただ,3次元グラフということになりますと,
    分析用のアプリケーションが別途必要なようで,VCで自作してみようと考えています。

    ちなみにイメージしているグラフとは,3つの軸に,高さ:計測値,縦横:計測位置をプロットし,
    離点した点を補間して,グラフを描画したいと考えています。

    入門書を書店で見ていますが,描画に関する記載が少ないな…という印象でして,ご質問しました。
    調べ方に問題がありそうですね。もう少し,あたってみます。


    2009年8月23日 4:04
  • 外池と申します。お話を伺っていて、おそらく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
    2009年8月24日 1:18
  • センサーからのデータは,インプットツールといったような市販の機器を介して,入力しています。
    その機器に付属のドライバによって,計測値を表示することは可能でした。

    ただ,3次元グラフということになりますと,
    分析用のアプリケーションが別途必要なようで,VCで自作してみようと考えています。

    ちなみにイメージしているグラフとは,3つの軸に,高さ:計測値,縦横:計測位置をプロットし,
    離点した点を補間して,グラフを描画したいと考えています。

    入門書を書店で見ていますが,描画に関する記載が少ないな…という印象でして,ご質問しました。
    調べ方に問題がありそうですね。もう少し,あたってみます。
    VC++初心者と書かれていますが、そもそも何処までの知識をお持ちなんでしょう?
    これによってレスを書く側で考慮しないといけない内容がかなり変わってきます。
    たとえば、C++言語に関しては既に知識があって自分でクラスを作成して利用する位の事まで
    出来ているならC++言語に関しては分かっている前提で話が出来ます。
    できれば、自分が理解している範囲について具体的に書いておくと状況にあったアドバイスを
    得られる可能性が高くなると思います。

    足りない部分がWindows上で動作するGUIアプリケーションの作成方法だけなら
    お勧めする書籍の内容も変わってくると思いますよ。
    C++言語その物を良く知らないなら言語の勉強からお勧めするでしょうし。

    Windowsでグラフィックス描画に関して調べると、GDIで地道に計算して対応するとか、
    DirectXやOpenGLを使って3Dを意識した描画ライブラリで対応するかとか幾つかの方法論が出来てきます。
    概念的な部分に関してはGDIの方が直感的に理解しやすいと思いますが、3D用のライブラリでは無いので
    自分で3Dを2D上で表現する為の座用計算が必要になるでしょう。
    逆にDirectX等の3D描画ライブラリを使用する場合は概念を理解する必要がありますが、
    必要な演算はライブラリの機能で賄えるという事になるでしょう。

    実際にひとつのアプリケーションを作成する場合に一冊の本だけみれば何とかなると言うのは
    稀な話で単機能のツール開発でもない限りは複数の書籍や多種多様のWeb上の情報を組み合わせて
    解決する必要があります。そういう意味ではどういうキーワードで調べるかで得られる情報もかなり
    変わってくると思います。


    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク sentakumono 2009年8月24日 17:09
    2009年8月24日 7:39
  • 大変わかりやすくご説明頂き,ありがとうございました。
    書店に並ぶ「入門書」を現在読み込んでおりますレベルですが,数学的な専門知識を要することがよくわかりました。

    外池さんがおっしゃるように,まずは構想をしっかりと練った上で,設計を行っていきたいと思います。

    また,お力を貸して下さい。ありがとうございました。

    2009年8月24日 16:55
  • ていねいにご相談に応じて頂きまして,ありがとうございました。

    VC++初心者と表現させていただきましたが,
    実はお恥ずかしながらプログラム自体の初心者でありまして,
    Cの基本文法を学び,短いプログラムを作成できる程度の超初心者であります。

    現在は,入門書レベルの書籍でCとの違いを確認しながら,
    小さなWindows画面ができていく喜びに,感激しているところです。

    PATIOさんにお答え頂きました方法論について,私の方でも調べてみたいと思っております。
    検索キーワード,大変勉強になりました。
    ありがとうございました。

    2009年8月24日 17:08
  • 老婆心ながら一言だけ。

    MFCを使って開発されるのでしたらC++言語のクラスの概念と派生、仮想関数など、
    オブジェクト指向に関する概念の理解は必須になります。
    この部分を理解していないとMFCは使いこなせませんので、
    もしMFCを使って開発をするおつもりならC++言語の文法周りの勉強をされた方が良いです。
    クラスや派生等のオブジェクト指向の概念はC言語には無かった部分ですので
    C言語とは設計等のアプローチも変わってきます。

    また、MFCの利用に関してはクラスの派生や仮想関数、関数のオーバーライド等が
    当たり前のように出てきますのでいきなりMFCを使うのではなくて、
    純粋なC++言語の勉強をして自分でクラスを作って派生させて使う事ができる程度の
    知識はあった方が良いです。この部分の知識が足りないと結構苦労しますので
    一見、回り道に見えてもC++言語の勉強をする事をお勧めします。

    解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。
    • 回答としてマーク sentakumono 2009年8月25日 7:35
    2009年8月25日 0:08
  • ご回答、ありがとうございました。
    独学でどこまでできますか不安なところでありますが、大変心強い気持ちとなりました。
    みなさんのお声に感謝いたします。
    PATIOさん、「一見回り道に見えても」を、大事にさせていただきます。

    2009年8月25日 7:34
  • あるかどうかまでは調べていませんが、自分で 3D を勉強して作るという手の他に、既成のコンポーネントを購入して利用するという手もあります。
    自分で作るのはそれなりに時間がかかり、業務でやっていれば人件費がかかりますので、買った方が安いこともあります。

    趣味であれば、がっつり勉強して自分で 3D をやるのも一手ですが、そこはモチベーションとかやりたいこと次第だと思います。
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月25日 14:21
    モデレータ
  •  携帯から書き込みできないここは、返答が遅れています。

     まず、先の返答の意図です。sentakumonoさんがなされた質問には、3つの質問が含まれていると思います。3つを一度に行うのではなく、一つ一つ別個に調査、質問されてはいかがでしょうか。


     プログラムを書くという仕事は、「したいこと」に対して、「どのように実現するか」を考えることです。「どのように実現するか」を考えるには、「しなければならないこと」を細かく分け、一つ一つのしなければならないことにたいして、「どうしたら実現できるか」を考えなければなりません。

     今、「センサーからデータを取り込んで、グラフ表示をする」という「したいこと」があります。この中から、しなければならないことを見つけます。ひとつは、「センサーからデータを取り込む」。ひとつは、「取り込んだデータをグラフ化する」。ひとつは、「描いたグラフを、時間経過と共に変化させる」。この3つではないでしょうか。


     3つの大きな「しなければならないこと」が出来ました。次は、このしなければならないことを「したいこと」として、また分解します。「センサーからデータを取り込む」については、センサーに付属のプログラムを応用すれば出来るということです。ですから、他の「しなければならないこと」を見ます。「取り込んだデータをグラフ化する」には、どうすればいいでしょう。まず、軸が表すものを決めます。y軸が「値」、x軸が「観測地点」ですね。次に、データの精度と、軸の精度の関係を決めます。例えば、y軸に200ピクセルを割り当てるとします。値として観測される範囲がどれくらいだから、1ピクセルが値いくらになる、と。x軸も同じ。このように、今わかっているものから求められるものを順に求めていきます。

     しかし、自力で描くよりも、Grape City 社さんの TrueChartLightStone 社さんの ORIGIN8 など、外部のコンポーネントを使うことを検討した方がいいかもしれません。


    Jitta@わんくま同盟
    2009年8月28日 8:47