グラフを描画するための別のモジュール

15年前、卒業証書プログラムでグラフを表示するのに時間がかかりました。BuilderまたはDelphiにプログラムがあり、すべてがうまくいくでしょうが、私はMFCでWindows用に書いただけで、グラフクラスではどういうわけかあまり良くありません。そして、私は自分のプロットモジュールを書きました。3〜5年が経過しましたが、モジュールは残り、再設計され、QNX、Linux、およびWindowsのクラフトで使用することがあります。おそらくそれはあなたにとって何らかの形で役立つでしょう。



提示されたグラフ描画モジュールを使用すると、凡例付きの任意の数の色付きグラフを表示できます。グラフ内のポイントの数は、スケールが変更されるたびにポイントのセットが作成され、に表示されるため、再描画の速度を大幅に低下させることなく、数千万以上(十分なメモリがある場合のみ)にすることができます。画面、スケールを考慮に入れます。したがって、ポイントの数は、スケールを変更するときに、これらの表示されたポイントの再計算時間にのみ影響します。



ラスタライズ関数はプラグインクラスに移動されました。現在、合計3つのオプションが可能です。MFCの標準Windows-GUI関数を使用した描画(CVideo_Windowsクラス)​​、標準Qt関数を使用した描画(CVideo_Qtクラス)、ソフトウェアラスター化(CVideo_Softwareクラス-このモジュールはマイクロコンピューターで使用できます)。ラスタライズクラスに必要な形式への文字のトランスコーディングは、CTranslatorクラスによって実行されます。



個別のクラスには、線種(タイプがラスタライズクラスでサポートされている場合)、色、点、長方形が含まれます。



マウスの左ボタンを押したままにすると、チャートフィールド内を移動できます。右ボタンで選択した領域を設定できます。マウスの右ボタンで指定した初期スケールに戻り、左ボタンでクリックすると拡大操作が行われます。



描画されたグラフ







は次のようになります。たとえば、MFCのWindows用のグラフクラスの作成は、次のように実行されます。



 CWnd_Graphics cWnd_Graphics;// 
 CGrData *cGrData_SinPtr;//    
 CGrData *cGrData_CosPtr;//    

// 
CRect cRect_Client;
((CStatic*)GetDlgItem(IDC_STATIC_MAIN_MAP))->GetClientRect(&cRect_Client);
cWnd_Graphics.Create(WS_VISIBLE,cRect_Client,(CStatic*)GetDlgItem(IDC_STATIC_MAIN_MAP));
 	
 // 
 cWnd_Graphics.GetIGraphicsPtr()->SetBackGroundColor(CGrColor(192,192,192));
 cWnd_Graphics.GetIGraphicsPtr()->SetLegendBackGroundColor(CGrColor(230,230,230));
 cWnd_Graphics.GetIGraphicsPtr()->SetAxisColor(CGrColor(0,0,0),CGrColor(0,0,0));
 cWnd_Graphics.GetIGraphicsPtr()->SetTextValueColor(CGrColor(0,0,0),CGrColor(0,0,0),CGrColor(0,0,0));
 cWnd_Graphics.GetIGraphicsPtr()->SetSelectRectangleColor(CGrColor(0,0,255)); 
 cWnd_Graphics.GetIGraphicsPtr()->SetName(" ");
 // 
 cGrData_SinPtr=cWnd_Graphics.GetIGraphicsPtr()->AddNewGraphic();
 cGrData_SinPtr->SetEnable(true);
 cGrData_SinPtr->SetGrColor(CGrColor(255,0,0));
 cGrData_SinPtr->SetGrLineStyle(CGrLineStyle(IVideo::LINE_TYPE_SOLID,1,false,false));
 cGrData_SinPtr->SetName(" ");
 
 for(size_t n=0;n<1024;n++)
 {
  double x=n;
  double y=sin(x*0.01);
  cGrData_SinPtr->AddPoint(x,y);
 }

 cGrData_CosPtr=cWnd_Graphics.GetIGraphicsPtr()->AddNewGraphic();
 cGrData_CosPtr->SetEnable(true);
 cGrData_CosPtr->SetGrColor(CGrColor(0,0,255));
 cGrData_CosPtr->SetGrLineStyle(CGrLineStyle(IVideo::LINE_TYPE_SOLID,3,false,false));
 cGrData_CosPtr->SetName(" ");

 for(size_t n=0;n<1024;n++)
 {
  double x=n;
  double y=cos(x*0.01);
  cGrData_CosPtr->AddPoint(x,y);
 }

 // ,    
 CGrRect cGrRect;
 cWnd_Graphics.GetIGraphicsPtr()->FindViewRectangle(cGrRect);
 cWnd_Graphics.GetIGraphicsPtr()->SetRectangle(cGrRect);
 cWnd_Graphics.GetIGraphicsPtr()->OnMagnify();
 cWnd_Graphics.GetIGraphicsPtr()->GetRectangle(cGrRect);
 cWnd_Graphics.GetIGraphicsPtr()->SetOriginalScale(cGrRect);

      
      





ここで、cWnd_Graphicsクラスは、CGraphicsグラフィッククラスとWindowsのバインディングを提供し、Windowsで発生するイベントをCGraphicsクラスに転送し、ON_WM_PAINT再描画イベントでグラフを表示します。他のOSの場合、使用するOSを考慮して、このバンドルを書き直す必要があります。この例では、cWnd_Graphics.GetIGraphicsPtr()を使用して、CGraphicsチャートクラスに直接アクセスしてチャート表示パラメーターを構成したり、チャートクラスに新しいチャートを作成してAddNewGraphicポインター( CGrDataクラスが取得されます)。このポインタを自分で削除することはできません。グラフはDeleteGraphic関数を介してのみ削除できます。将来的には、スケジュールの処理は結果のポインターを介して実行されます。



合計で、次のチャート管理機能を使用できます。



CGrData* AddNewGraphic(void);//       
  void DeleteAllGraphics(void);//    
  void DeleteGraphic(CGrData *cGrDataPtr);//   
  void FindRectangle(CGrRect &cGrRect) const;//     
  void FindRectangleOfEndPoints(CGrRect &cGrRect,size_t points) const;//        points 
  void FindRectangleOfEndTime(CGrRect &cGrRect,long double time) const;//        time 
  void FindViewRectangle(CGrRect &cGrRect) const;//         
  void FindViewRectangleOfEndPoints(CGrRect &cGrRect,size_t points) const;//            points 
  void FindViewRectangleOfEndTime(CGrRect &cGrRect,long double time) const;//            time 
  void SetTimeDivider(double value);//  
  double GetTimeDivider(void) const;//  
  // 
  void CancelSelect(void);// 
  void Redraw(void);// 
  void RedrawAll(void);// 
  void OnOriginalScale(void);//    
  //  
  void SetBackGroundColor(const CGrColor &cGrColor);//  
  void SetLegendBackGroundColor(const CGrColor &cGrColor);//   
  void SetAxisColor(const CGrColor &cGrColor_AxisX,const CGrColor &cGrColor_AxisY);//  
  void SetGridColor(const CGrColor &cGrColor_GridX,const CGrColor &cGrColor_GridY);//  
  void SetSelectRectangleColor(const CGrColor &cGrColor);//   
  void SetTextValueColor(const CGrColor &cGrColor_TextX,const CGrColor &cGrColor_TextY,const CGrColor &cGrColor_TextLegend);//  
  //   
  void SetAxisLineStyle(const CGrLineStyle &cGrLineStyle_AxisX,const CGrLineStyle &cGrLineStyle_AxisY);//  
  void SetGridLineStyle(const CGrLineStyle &cGrLineStyle_GridX,const CGrLineStyle &cGrLineStyle_GridY);//  
  //   
  void SetRectangle(const CGrRect &cGrRect);//   
  void SetGridStep(long double step_x,long double step_y);//  
  void GetRectangle(CGrRect &cGrRect) const;//   
  void GetGridSize(long double &step_x,long double &step_y) const;//   
  //  
  void SetEnableMagnify(bool enable);// 
  void SetEnableValue(bool x_value,bool y_value);//  
  void SetOriginalScale(const CGrRect &cGrRect);//  
  void SetMoveMode(bool inversion);//   
  bool GetSelectedRectangle(CGrRect &cGrRect) const;//  
  void GetClientRectangle(CGrRect &cGrRect) const;//  
  void SetName(const std::string &name);//  
  bool GetUserMode(void) const;//   
  void SetUserMode(bool state);//   

      
      





原則として、表示は非常に柔軟にカスタマイズできます。



最後の2つの機能で指定されたユーザー制御モードは、更新を含むデータを出力するときに使用されます(たとえば、計測器は特定の周波数でポイントを追加します)。この場合、グラフを移動/拡大しようとするとユーザーコントロールモードが有効になり、元の縮尺に戻るとこのモードは無効になります。これにより、データの追加中にスケールの変更を停止できます(モードが有効になっている場合は、上記の例のように、スケールの再計算を呼び出す必要はありません)。



このモジュールを使用するプログラムの例(モジュールのソースがあります)。

プロジェクトには、main.cpp、cdialog_main.h、cdialog_main.cpp、stdafx.hの4つのファイルがあります。これらの4つのファイルには、プロットモジュールの接続例が含まれています。他のすべてのソースファイルは、プロットモジュールの一部です。



まあ、それは実際にこの原始的な工芸品について言えることのすべてです。

PSここで、関数(グラフ-グラフ、およびグラフィック-グラフィックス)に不幸な名前があることを尋ねられました。申し訳ありませんが、ドイツ語を学び、英語ではこんな感じになると思いました。:)



All Articles