绘制3D饼图的方法
大家在MFC绘制图形时,可以用ms的免费插件mschart,或是功能强大的付费插件,在网上还可以找到一些免费的代码。功能自然没有前者强大,通用性也有一定的限制。不如自己动手:画饼图。
画饼图要有几个辅助函数:
这个函数的功能是把正圆上的角度推算成饼图椭圆上的角度。
int
CDlgPie::TransformAngel(CRect rect,
int
angel)
{
int nRectWidth = rect.Width();
int nRectHeight = rect.Height();
double x = nRectWidth * cos(angel * PI / 180);
double y = nRectHeight * sin(angel * PI / 180);
float result = (float)(atan2(y, x) * 180 / PI);
if (result < 0)
{
result += 360;
}
int iResult = (int)(result+0.5);
return iResult;
}
{
int nRectWidth = rect.Width();
int nRectHeight = rect.Height();
double x = nRectWidth * cos(angel * PI / 180);
double y = nRectHeight * sin(angel * PI / 180);
float result = (float)(atan2(y, x) * 180 / PI);
if (result < 0)
{
result += 360;
}
int iResult = (int)(result+0.5);
return iResult;
}
另一个:
这个函数是用高中的椭圆公式推出来的,但是我数学比较垃圾,不知道应该怎么简化它了。
CPoint CDlgPie::GetEllipsePoint(CRect rect,
int
angel)
{
float a = (float)rect.Width() / 2;
float b = (float)rect.Height() / 2;
angel = angel % 360;
UINT quant = angel / 90 + 1;
float fAngel = (float)((float)angel / 360 * 2 * PI);
float tangent = (float)tan( fAngel );
double x = sqrt( a*a*b*b / (b*b + a*a*tangent*tangent) );
double y = sqrt( (a*a*b*b - b*b*x*x) / a / a );
switch ( quant )
{
case 1:
break;
case 2:
x = -x;
break;
case 3:
x = -x;
y = -y;
break;
case 4:
y = -y;
break;
default:
break;
}
x = (int)(x+0.5);
y = (int)(y+0.5);
int nTempX = (int)(a + 0.5);
int nTempY = (int)(b + 0.5);
int iResultX = (int)x + nTempX + rect.left;
int iResultY = abs((int)y - nTempY - rect.top);
return CPoint(iResultX, iResultY);
}
{
float a = (float)rect.Width() / 2;
float b = (float)rect.Height() / 2;
angel = angel % 360;
UINT quant = angel / 90 + 1;
float fAngel = (float)((float)angel / 360 * 2 * PI);
float tangent = (float)tan( fAngel );
double x = sqrt( a*a*b*b / (b*b + a*a*tangent*tangent) );
double y = sqrt( (a*a*b*b - b*b*x*x) / a / a );
switch ( quant )
{
case 1:
break;
case 2:
x = -x;
break;
case 3:
x = -x;
y = -y;
break;
case 4:
y = -y;
break;
default:
break;
}
x = (int)(x+0.5);
y = (int)(y+0.5);
int nTempX = (int)(a + 0.5);
int nTempY = (int)(b + 0.5);
int iResultX = (int)x + nTempX + rect.left;
int iResultY = abs((int)y - nTempY - rect.top);
return CPoint(iResultX, iResultY);
}
既然是立体的,就的有阴影的效果。
long
CDlgPie::GetDimColor(
long
lOriginColor)
{
//////////////////////////////////////////////////////////////////////////
// 取得原颜色的RGB值
long lRed = GetRValue(lOriginColor);
long lGreen = GetGValue(lOriginColor);
long lBlue = GetBValue(lOriginColor);
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 对RGB颜色取半
long lResultRed = lRed / 2;
long lResultGreen = lGreen / 2;
long lResultBlue = lBlue / 2;
long lResultColor = RGB(lResultRed, lResultGreen, lResultBlue);
//////////////////////////////////////////////////////////////////////////
return lResultColor;
}
{
//////////////////////////////////////////////////////////////////////////
// 取得原颜色的RGB值
long lRed = GetRValue(lOriginColor);
long lGreen = GetGValue(lOriginColor);
long lBlue = GetBValue(lOriginColor);
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
// 对RGB颜色取半
long lResultRed = lRed / 2;
long lResultGreen = lGreen / 2;
long lResultBlue = lBlue / 2;
long lResultColor = RGB(lResultRed, lResultGreen, lResultBlue);
//////////////////////////////////////////////////////////////////////////
return lResultColor;
}