绘制3D饼图的方法

时间:2022-07-03 15:01:52

绘制3D饼图的方法

大家在MFC绘制图形时,可以用ms的免费插件mschart,或是功能强大的付费插件,在网上还可以找到一些免费的代码。功能自然没有前者强大,通用性也有一定的限制。不如自己动手:画饼图。

画饼图要有几个辅助函数:

这个函数的功能是把正圆上的角度推算成饼图椭圆上的角度。

绘制3D饼图的方法int  CDlgPie::TransformAngel(CRect rect,  int  angel)
绘制3D饼图的方法绘制3D饼图的方法
... {
绘制3D饼图的方法    
int nRectWidth = rect.Width();
绘制3D饼图的方法    
int nRectHeight = rect.Height();
绘制3D饼图的方法    
double x = nRectWidth * cos(angel * PI / 180);
绘制3D饼图的方法    
double y = nRectHeight * sin(angel * PI / 180);
绘制3D饼图的方法    
float result = (float)(atan2(y, x) * 180 / PI);
绘制3D饼图的方法
绘制3D饼图的方法    
if (result < 0
绘制3D饼图的方法绘制3D饼图的方法    
...{
绘制3D饼图的方法        result 
+= 360;
绘制3D饼图的方法    }

绘制3D饼图的方法
绘制3D饼图的方法    
int iResult = (int)(result+0.5);
绘制3D饼图的方法    
return iResult;
绘制3D饼图的方法}

 

另一个:
这个函数是用高中的椭圆公式推出来的,但是我数学比较垃圾,不知道应该怎么简化它了。

绘制3D饼图的方法CPoint CDlgPie::GetEllipsePoint(CRect rect,  int  angel)
绘制3D饼图的方法绘制3D饼图的方法
... {
绘制3D饼图的方法    
float a = (float)rect.Width() / 2;
绘制3D饼图的方法    
float b = (float)rect.Height() / 2;
绘制3D饼图的方法
绘制3D饼图的方法    angel 
= angel % 360;
绘制3D饼图的方法    UINT quant 
= angel / 90 + 1;
绘制3D饼图的方法
绘制3D饼图的方法    
float fAngel = (float)((float)angel / 360 * 2 * PI);
绘制3D饼图的方法    
float tangent = (float)tan( fAngel );
绘制3D饼图的方法
绘制3D饼图的方法    
double x = sqrt( a*a*b*/ (b*+ a*a*tangent*tangent) );
绘制3D饼图的方法    
double y = sqrt( (a*a*b*- b*b*x*x) / a / a );
绘制3D饼图的方法
绘制3D饼图的方法    
switch ( quant )
绘制3D饼图的方法绘制3D饼图的方法    
...{
绘制3D饼图的方法    
case 1:
绘制3D饼图的方法        
break;
绘制3D饼图的方法    
case 2:
绘制3D饼图的方法        x 
= -x;
绘制3D饼图的方法        
break;
绘制3D饼图的方法    
case 3:
绘制3D饼图的方法        x 
= -x;
绘制3D饼图的方法        y 
= -y;
绘制3D饼图的方法        
break;
绘制3D饼图的方法    
case 4:
绘制3D饼图的方法        y 
= -y;
绘制3D饼图的方法        
break;
绘制3D饼图的方法    
default:
绘制3D饼图的方法        
break;
绘制3D饼图的方法    }

绘制3D饼图的方法    x 
= (int)(x+0.5);
绘制3D饼图的方法    y 
= (int)(y+0.5);
绘制3D饼图的方法    
绘制3D饼图的方法    
int nTempX = (int)(a + 0.5);
绘制3D饼图的方法    
int nTempY = (int)(b + 0.5);
绘制3D饼图的方法
绘制3D饼图的方法    
int iResultX = (int)x + nTempX + rect.left;
绘制3D饼图的方法    
int iResultY = abs((int)y - nTempY - rect.top);
绘制3D饼图的方法    
return CPoint(iResultX, iResultY);
绘制3D饼图的方法}

 

既然是立体的,就的有阴影的效果。 

绘制3D饼图的方法long  CDlgPie::GetDimColor( long  lOriginColor)
绘制3D饼图的方法绘制3D饼图的方法
... {
绘制3D饼图的方法绘制3D饼图的方法    
/**///////////////////////////////////////////////////////////////////////////
绘制3D饼图的方法    // 取得原颜色的RGB值
绘制3D饼图的方法
    long lRed = GetRValue(lOriginColor);
绘制3D饼图的方法    
long lGreen = GetGValue(lOriginColor);
绘制3D饼图的方法    
long lBlue = GetBValue(lOriginColor);
绘制3D饼图的方法绘制3D饼图的方法    
/**///////////////////////////////////////////////////////////////////////////
绘制3D饼图的方法
绘制3D饼图的方法    
//////////////////////////////////////////////////////////////////////////

绘制3D饼图的方法    // 对RGB颜色取半
绘制3D饼图的方法
    long lResultRed = lRed / 2;
绘制3D饼图的方法    
long lResultGreen = lGreen / 2;
绘制3D饼图的方法    
long lResultBlue = lBlue / 2;
绘制3D饼图的方法    
long lResultColor = RGB(lResultRed, lResultGreen, lResultBlue);
绘制3D饼图的方法绘制3D饼图的方法    
/**///////////////////////////////////////////////////////////////////////////
绘制3D饼图的方法
绘制3D饼图的方法    
return lResultColor;
绘制3D饼图的方法}
绘制3D饼图的方法