Modul lain untuk menggambar grafik

Lima belas tahun yang lalu, saya perlu menampilkan grafik di program diploma saya. Akan ada program di Builder atau Delphi, semuanya akan baik-baik saja, tetapi saya hanya menulis untuk Windows di MFC, dan di sana entah bagaimana tidak terlalu bagus dengan kelas grafik. Dan kemudian saya menulis modul plotting saya sendiri. Tiga lima tahun telah berlalu, tetapi modul tersebut tetap ada, didesain ulang dan saya terkadang menggunakannya dalam keahlian saya di QNX, Linux dan Windows. Mungkin ini akan berguna bagi Anda dalam beberapa hal.



Modul gambar grafik yang disajikan memungkinkan Anda untuk menampilkan grafik berwarna dalam jumlah yang berubah-ubah dengan sebuah legenda. Jumlah titik dalam grafik bisa puluhan juta atau lebih (jika hanya ada cukup memori) tanpa penurunan yang signifikan dalam kecepatan penggambaran ulang, karena setiap kali skala diubah, sekumpulan titik dibangun, ditampilkan pada layar, dengan mempertimbangkan skala. Jadi, jumlah titik hanya mempengaruhi waktu penghitungan ulang dari titik-titik yang ditampilkan ini saat mengubah skala.



Fungsi rasterisasi telah dipindahkan ke kelas plugin. Secara total, tiga opsi saat ini dimungkinkan: menggambar dengan fungsi Windows-GUI standar dari MFC (kelas CVideo_Windows), menggambar dengan fungsi Qt standar (kelas CVideo_Qt) dan rasterisasi perangkat lunak (kelas CVideo_Software - dengan revisi modul ini dapat digunakan pada mikrokontroler). Transcoding karakter ke dalam format yang diperlukan untuk kelas rasterisasi dilakukan oleh kelas CTranslator.



Kelas terpisah termasuk tipe garis (jika tipe tersebut didukung oleh kelas rasterisasi), warna, titik, persegi panjang.



Dengan menahan tombol kiri mouse, Anda dapat bergerak di sekitar bidang grafik. Dengan tombol kanan, Anda dapat mengatur area yang dipilih, dengan mengklik di mana dengan tombol kanan mouse Anda akan kembali ke skala awal yang ditentukan, dan setelah mengklik dengan tombol kiri, operasi pembesaran akan dilakukan.



Grafik yang digambar terlihat seperti ini:







Membuat kelas grafik, misalnya, untuk Windows di MFC, dilakukan sebagai berikut:



 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);

      
      





Di sini, kelas cWnd_Graphics menyediakan pengikatan kelas grafis CGraphics dengan Windows, meneruskan peristiwa yang terjadi di Windows ke kelas CGraphics dan menyediakan tampilan grafik di peristiwa gambar ulang ON_WM_PAINT. Untuk OS lain, bundel ini perlu ditulis ulang, dengan mempertimbangkan OS yang digunakan. Dalam contoh ini, melalui cWnd_Graphics.GetIGraphicsPtr (), Anda dapat langsung mengakses kelas bagan CGraphics dan mengonfigurasi parameter tampilan bagan, serta meminta kelas bagan untuk membuat bagan baru dan mengembalikan penunjuk AddNewGraphic ke dalamnya (penunjuk ke Kelas CGrData akan diperoleh). Anda tidak dapat menghapus penunjuk ini sendiri - bagan hanya dapat dihapus melalui fungsi DeleteGraphic. Di masa mendatang, pekerjaan dengan jadwal dilakukan melalui penunjuk yang dihasilkan.



Secara total, fungsi manajemen bagan berikut tersedia:



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);//   

      
      





Pada prinsipnya, Anda dapat menyesuaikan tampilan dengan cukup fleksibel.



Mode kontrol pengguna yang ditentukan dalam dua fungsi terakhir digunakan saat mengeluarkan data dengan pembaruan (misalnya, instrumen menambahkan titik pada frekuensi tertentu). Dalam kasus ini, ketika Anda mencoba untuk memindahkan / memperbesar grafik, mode kontrol pengguna diaktifkan, dan ketika Anda kembali ke skala asli, mode ini dinonaktifkan. Ini memungkinkan Anda untuk berhenti mengubah skala sambil menambahkan data (jika mode diaktifkan, maka Anda tidak perlu memanggil penghitungan ulang skala, seperti pada contoh di atas).



Contoh program yang menggunakan modul ini (ada sumber modul).

Ada 4 file dari proyek - main.cpp, cdialog_main.h, cdialog_main.cpp dan stdafx.h. Keempat file ini berisi contoh menghubungkan modul plotting. Semua file sumber lainnya adalah bagian dari modul plotting.



Nah, sebenarnya hanya itu yang bisa dikatakan tentang kerajinan primitif ini.

PS Saya diminta di sini bahwa saya memiliki nama yang tidak menguntungkan untuk fungsi (Grafik - grafik, dan Grafik - grafik). Maaf, saya belajar bahasa Jerman dan berpikir bahwa dalam bahasa Inggris akan seperti ini. :)



All Articles