座標曲線的程式設計實現 (轉)
座標曲線的實現
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
- Qt QPolarChart極座標圖(阿基米德線、四葉曲線、六葉花瓣、三葉花瓣、心形曲線)QT
- 大角度非迭代的空間座標旋轉C#實現C#
- C++ opencv的圓轉矩形,極座標轉笛卡爾座標系C++OpenCV
- 百度地圖拾取座標工具-toolfk程式設計師線上工具地圖程式設計師
- Android 身高體重曲線的實現Android
- Flutter 實現平滑曲線折線圖Flutter
- python實現excel單元格位置轉10進位制座標PythonExcel
- 深入淺出matplotlib(15):同一座標裡顯示多條曲線
- 利用齊次座標進行二維座標轉換
- 模擬經營類遊戲:目標感與挑戰曲線的設計遊戲
- 地心地固座標系(ECEF)與站心座標系(ENU)的轉換
- Shader 中的座標計算
- python-科研繪圖系列(6)-深度模型準確率,誤差收斂曲線圖;雙座標繪圖;雙座標圖例放置在一個框中;帶95%置信區間的曲線圖Python繪圖模型
- Qt - 座標系及轉換QT
- GPS座標轉換為BIM
- IoT座標系下,智慧路由器將畫出一條怎樣的進化曲線?路由器
- JavaScript實現線上進位制轉換工具網站 -toolfk程式設計師線上工具網JavaScript網站程式設計師
- 海康相機 畫素座標(px,py)到sdk ptz 座標轉換最後到onvif ptz座標
- gps wgs4座標與高德gcj02座標互轉GC
- SICP:複數的直角和極座標的表示(Python實現)Python
- 實現JSON線上美化(格式化)、JSON轉CSV、CSV轉XML工具-toolfk程式設計師工具網JSONXML程式設計師
- JavaScript實現線上Markdown編輯器、轉換HTML工具-toolfk程式設計師工具網JavaScriptHTML程式設計師
- JS實現線上CSV轉換PHP、Mysql、Ruby等工具 -toolfk程式設計師工具網JSPHPMySql程式設計師
- Python網路程式設計實現TCP和UDP連線Python程式設計TCPUDP
- aop面向切面程式設計的實現程式設計
- Go版本的各座標系互相轉換的工具Go
- 貝塞爾曲線(Bezier curve)實現節點連線
- [轉]旋轉矩陣:點旋轉和座標系旋轉矩陣
- C++程式設計實現C++程式設計
- Excel轉百度座標系(AngularJS)ExcelAngularJS
- echarts 隱藏X軸底部超出的座標線Echarts
- <Redis設計與實現>筆記【轉】Redis筆記
- 【matplotlib 實戰】--平行座標系
- python畫圖 去除橫縱座標值;設定橫縱座標名稱;設定座標軸刻度大小Python
- 你知道嗎, CoreGraphics繪圖系統和Bezier貝塞爾曲線座標系的順時針方向是相反的!繪圖
- ArcGIS地圖投影與座標系轉換的方法地圖