因工作原因,學習相關zedgraph原始碼來解決一些問題。剛看到這個開源圖表控制項時,感覺還是短小精悍的。
結合zedgraph控制項的例子大致看了下對應的原始碼,寫下點感悟。
這裡先大致說一些zedgraph裡的元素。
1.panel:zedgraph控制項是如何畫出來的,就是這這個上面畫出來,後面的元素如座標軸,線條,餅圖。
2.axis:軸線,任何二維線型、條型、餅型圖表都需要乙個座標軸,至少有x軸,y軸,然後我們才能在上面畫相應的線條,餅型等元素。
3.curveitem:我們剛說到在有座標軸後,那麼需要畫我們的線條,條型,餅型什麼的,curveitem就是儲存我們的資料然後畫出對應的圖形。
4.graphobj:我們在整個panel裡可能要標出一些資訊,如某點要新增相應描述,或是我們要標示有一部分是警告區域,都可以由這個來完成。
5.majortic與minortic:這二個物件都是針對axis來說的,主要是描述上面的軸線上的主高刻度與副刻度。
6.scale:這個和上面的物件一樣是axis來說的,主要是描述軸線上的刻度顯示的對應的數字與標識。
7.pointpair:這個就是針對curveitem來說的,curveitem裡儲存著相應的資料,而這些資料就放在pointpair隊例裡。
這些其實就是構成統計圖一些主要元素了,當然還有一些用於輔助的如:legend(簡單來說就是對應curvitem圖形的縮微圖),fill(用於填充物件的),border(描述元素邊界的),symbol(點上的圖形).
上面的1-7中,除5,6外都是有對應的集合類。
它們之間的關係如下。
panel可以包含axis,curveitem,graphobj這些元素的集合,而在其中乙個curveitem可以對應乙個x軸和y軸,也可以多個curveitem對應乙個x軸,而graphobj與axis和curveitem沒有直接關係。
curveitem裡包含著pointpair的集合,而axis包含著tic與scale資訊。
這裡我先給出一些panebase相關的原始碼。
在這個類裡,有個屬性叫basedimension。
public float basedimension在源**裡給出一段說明,如果basedimension=8英吋,在chart圖有8英吋寬的時候,如果標題為14畫素那麼高,那麼在chart圖縮小到4英吋寬的時候,標題也會縮小到7個畫素那麼高。set
}
是不是有點湖裡湖塗的,在這裡我先解釋一下英吋與畫素的關係,這個還關係到另外一值,dpi(點每英吋),這個和顯示器有關,現在的顯示器一般是96dpi吧,老一點的一般是72dpi,在這裡面也是用的72dpi,在這裡8英吋用96dpi就是768畫素。
這裡先到這裡,我們看下,它是如何用達到伸縮chart圖而引起相應title跟著伸縮的。先看如下一段**。
public float calcscalefactor()這段上有說明,得到乙個比例因子,用於繪製元素,這段**很簡單,它首先會得到判斷有沒設定字型可以縮放,如不可以直接返回1,然後取panel自身的寬度,然後取寬與長的比例,如果寬大於1.5倍的長,那麼取1.5倍的長,如果長大於寬1.5倍的長,則取寬的1.5倍長,如果不在這範圍,就取其寬度。而這個比例因子就是這個前面所說的basedimension所點的畫素點(不過是老機器上的),也就是576,就是說長寬適合,寬為576的話,是不會發生任何縮放的。
得到這個比例因子後能做什麼了?繪圖,能繪你伸縮chart圖成任何比例都還能顯示比例適合的圖,看如下一段**。
public rectanglef calcclientrect( graphics g, float scalefactor )這一段**是為了得到chart圖除標題外的可用面積,這裡我只看中間得到中間那段,我用如下圖來說明。// calculate the legend rect, and back it out of the current chartrect
g, this, scalefactor, ref innerrect );
return innerrect;
}
這裡可以看到我們伸縮外面如何通過比例因子來影響裡面元素大小了。
其實在panebase裡的draw()函式裡就看到,首先是得到比例因子,然後再把比例因子當做各個繪製元素的引數。
Spring原始碼學習(一)
人對神秘的東西即好奇又恐懼,好奇心使人想一 竟恐懼心又使人望而卻步,工作了那麼久對spring原始碼一直懷有這樣的心態,從來沒有下決心進行研讀,最近感覺壓力在攀公升,使自己不得不戰勝恐懼心,進行更深入的學習,希望自己的學習同樣也能給你小夥伴們帶來一絲靈感。接下來將更加一下小例子來跟讀一下原始碼的實現...
tensorflow 原始碼學習 一
作為主流的機器學習框架,tensorflow的提供的介面變化很多,專案 也比較複雜,為了讓自己使用起來更得心應手,所以覺得還是有必要學習一下原始碼。個人覺得提公升程式設計水平的兩種最好方式,乙個是自己造輪子,再乙個就是閱讀原始碼。1.版本 2.整體專案結構 這並不是tensorflow完整的專案結構...
Spring原始碼學習(一) IoC
一直想抽空把spring原始碼拿來讀讀,但真正去做這件事的時候發現不簡單,spring發展這麼多年,它的規模已不是乙個一般的開源框 架所能比的,它的主要架構和流程不是非常清晰,很難抓到要害,但有一點可以肯定,它的根基是ioc和aop,所有的功能擴充套件和對其他開源框架的支援都是基 於這兩點來做的,因...