座標曲線的程式設計實現 (轉)
座標曲線的實現
lipku@water.pku.edu.cn
由於統計圖的直觀顯示,在實際應用中經常會要畫各種統計圖。座標曲線圖是其中比較常用的一種。而座標曲線在各種統計圖中應該算比較難畫的,主要是很難將座標值與圖中的位置對應起來。我在做一個網站的專案中曾遇到過要畫座標曲線,由於沒有易用免費的可用,只好自己來實現。因此對畫座標曲線有了一點心得。
畫座標曲線的主要思路是:先找到座標值中x的最小值minX,最大值maxX。同樣取到y的最小值minY,最大值maxY。設圖形寬度為width,高度為height,於是對於座標(x,y)對應到圖上的位置是 :
((x-minX)*width/(maxX-minX),(y-minY)*height/(maxY-minY))
下面結合具體程式碼給以詳細解釋。這段程式碼基本適合畫各種座標曲線,既可以把原點畫在座標軸上,也可以不畫在座標軸上。為了方便大家執行,我全部改成了VC程式碼,只要在VC中新建一個project,把下面的程式碼複製到OnDraw()中即可實現。各位只要稍微修改一下,就可以在其他各種程式語言中實現。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CDrawCoorView::OnDraw(CDC* pDC)
{
CDrawCoorDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
:namespace prefix = o ns = "urn:schemas--com::office" />
//初始化座標值,一般從取得。這裡為了示例方便取得比較簡單
const int num=10;
float initX[num]={1,2,3,4,5,6,7,8,9,10};
float initY[num]={0.5,2,2.8,4,5.6,6,7,9.4,13.8,23.4};
//分別取得X和Y最大值,最小值
float maxX=initX[0];
float minX=initX[0];
float maxY=initY[0];
float minY=initY[0];
for(int i=0;i { if(initX[i]>maxX) maxX=initX[i]; if(initX[i] minX=initX[i]; if(initY[i]>maxY) maxY=initY[i]; if(initY[i] minY=initY[i]; } //如果原點必須在X軸上,加上下面2行,否則註釋掉 if(minX>0) minX=0; //如果原點必須在Y軸上,加上下面2行,否則註釋掉 if(minY>0) minY=0; //確定圖象顯示大小 int width=500; int height=300; //確定座標圖四周預留的空白大小 const int mytop=10; const int mybottom=40; const int myleft=80; const int myright=50; //確定X,Y軸每單位顯示寬度 float intervalX=(width-myleft-myright)/(maxX-minX); float intervalY=(height-mybottom-mytop)/(maxY-minY); //繪製曲線。由於繪圖座標的Y軸是向下延升,所以這裡每個點的Y值是用 //圖象高度減去y值大小。 pDC->MoveTo(int(myleft+(initX[0]-minX)*intervalX), int(height-(mybottom+(initY[0]-minY)*intervalY))); for(i=0;i { pDC->Lo(int(myleft+(initX[i]-minX)*intervalX), int(height-(mybottom+(initY[i]-minY)*intervalY))); } //繪製X,Y軸 //X軸從圖形區域最左端到最右端 float bottomY=0; float leftX=0; //bottomY表示X軸的y值,leftX表示Y軸的x值 if(minY>0) bottomY=minY; if(minX>0) leftX=minX; pDC->MoveTo(int(myleft),int(height-(mybottom+(bottomY-minY)*intervalY))); pDC->LineTo(int(width-myright),int(height-(mybottom+(bottomY-minY)*intervalY))); //Y軸從圖形區域最底端到最頂端 pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-mybottom)); pDC->LineTo(int(myleft+(leftX-minX)*intervalX),int(mytop)); //確定顯示刻度個數 const int count=5; //確定每個顯示刻度之間的寬度 float spaceX=(width-myleft-myright)/count; float spaceY=(height-mybottom-mytop)/count; //繪製刻度和刻度值 CString str; //X軸 for(i=0;i<=count;i++) { str.Format("%.1f",minX+i*(maxX-minX)/count); pDC->MoveTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY))); pDC->LineTo(int(myleft+spaceX*i),int(height-(mybottom+(bottomY-minY)*intervalY+5))); pDC->TextOut(int(myleft+spaceX*i-10), int(height-(mybottom+(bottomY-minY)*intervalY-5)),str); } //Y軸 for(i=0;i<=count;i++) { str.Format("%.1f",minY+i*(maxY-minY)/count); pDC->MoveTo(int(myleft+(leftX-minX)*intervalX),int(height-(mybottom+spaceY*i))); pDC->LineTo(int(myleft+(leftX-minX*intervalX+5),int(height-(mybottom+spaceY*i))); pDC->TextOut(int(myleft+(leftX-minX)*intervalX-30), int(height-(mybottom+spaceY*i+8)),str); } //繪製X,Y軸的變數名 pDC->TextOut(width/2,height-20,"時間(h)"); pDC->TextOut(0,height/2,"產量(kg)"); }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-998549/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- vue 實現高德座標轉GPS座標Vue
- 工程座標轉換方法C#程式碼實現C#
- 張正友標定Opencv實現、標定流程以及影像座標轉為世界座標OpenCV
- 用OpenGL實現射線揀取物件程式設計(轉)物件程式設計
- Qt QPolarChart極座標圖(阿基米德線、四葉曲線、六葉花瓣、三葉花瓣、心形曲線)QT
- Flutter 實現平滑曲線折線圖Flutter
- 大角度非迭代的空間座標旋轉C#實現C#
- C++ opencv的圓轉矩形,極座標轉笛卡爾座標系C++OpenCV
- canvas實現的賽貝爾曲線效果程式碼例項Canvas
- Linux守護程式的程式設計實現(轉)Linux程式設計
- 模擬經營類遊戲:目標感與挑戰曲線的設計遊戲
- XML 程式設計思想:利用模式標準化實現自上而下的語義透明(轉)XML程式設計模式
- Android 身高體重曲線的實現Android
- 深入淺出matplotlib(15):同一座標裡顯示多條曲線
- ogre世界座標魚螢幕座標相互轉換
- 《程式設計師》雜誌:我的資料庫學習“曲線”程式設計師資料庫
- python-科研繪圖系列(6)-深度模型準確率,誤差收斂曲線圖;雙座標繪圖;雙座標圖例放置在一個框中;帶95%置信區間的曲線圖Python繪圖模型
- IoT座標系下,智慧路由器將畫出一條怎樣的進化曲線?路由器
- canvas實現高階貝塞爾曲線Canvas
- 利用齊次座標進行二維座標轉換
- 庫克曲線(轉載)
- 【計算幾何】求線段相交交點座標
- 貝塞爾曲線(Bezier curve)實現節點連線
- python實現excel單元格位置轉10進位制座標PythonExcel
- 地心地固座標系(ECEF)與站心座標系(ENU)的轉換
- Shader 中的座標計算
- Delphi程式設計:完全控制桌面的實現 (轉)程式設計
- 重新計算圖形左上角座標實現canvas上的圖形拖拽Canvas
- 在網頁上釋出統計曲線 (轉)網頁
- Qt - 座標系及轉換QT
- 火星座標和正常座標之間的轉換
- 海康相機 畫素座標(px,py)到sdk ptz 座標轉換最後到onvif ptz座標
- 虛擬裝置驅動程式的設計與實現 (轉)
- 針對Excel表格檔案操作的程式設計實現 (轉)Excel程式設計
- 程式設計師的100條座右銘程式設計師
- 設定元素在文件中的座標
- 你知道嗎, CoreGraphics繪圖系統和Bezier貝塞爾曲線座標系的順時針方向是相反的!繪圖
- echarts 隱藏X軸底部超出的座標線Echarts