這個代碼很簡單,也就是定義了一個餅圖 項目的一些屬性。
餅圖文檔對象 PIEShape
本對象定義了一個完整的餅圖, 是本程序的核心模塊。本對象首先是PieShapeItem的一個強類型列表,它是從 System.Collections.CollectionBase上面派生的,通過使用對象的Add或Remove方法就能往 這個對象添加或刪除餅圖項目對象PIEShapeItem。當向列表添加項目時未指定項目顏色時會 創建一個默認顏色,本類型定義了一個StdColors的靜態的顏色數組,新餅圖元素的顏色就根 據這個顏色數組進行分配。
對象定義了一個RefreshState方法用來計算各個餅圖元素 對應的扇形區域的起始角度和終止角度。
/// <summary>
/// 刷 新對象狀態
/// </summary>
/// <remarks>
/// 本函數中反 向遍歷所有的餅圖項目,
/// 計算各個餅圖項目的起始和終止角度 </remarks>
public void RefreshState()
{
double TotalValue = 0 ;
foreach( PIEShapeItem item in this )
{
TotalValue += item.Value ;
}
float AngleCount = 0 ;
for( int iCount = this.Count - 1 ; iCount >= 0 ; iCount -- )
{
PIEShapeItem item = this[ iCount ] ;
float angle = ( float ) ( 360.0 * item.Value / TotalValue ) ;
item.StartAngle = ( float ) Math.Round( AngleCount , 3 ) ;
item.EndAngle = ( float ) Math.Round( AngleCount + angle , 3 ) ;
AngleCount += angle ;
item.StartAngle = ( float ) Math.Round( FixAngle( item.StartAngle ) , 3 );
item.EndAngle = ( float ) Math.Round( FixAngle( item.EndAngle ) , 3 ) ;
}
}
/// <summary>
/// 根據橢圓形狀修正角度
/// </summary>
/// <param name="angle">原始角度 </param>
/// <returns>修正後的角度值</returns>
private float FixAngle( float angle )
{
if( ( angle % 90.0 ) == 0 )
return angle ;
if( intWidth == intHeight )
return angle ;
double x = intWidth * Math.Cos( angle * Math.PI / 180 );
double y = intHeight * Math.Sin( angle * Math.PI / 180 );
float result = ( float ) ( Math.Atan2( y , x ) * 180 / Math.PI );
if( result < 0 )
result += 360 ;
return result ;
}