3d pie chart
方法一:
目前实现效果,就是用drawPie函数分别画上下间距相同并且startAgl和spanAgl相同的两组扇形(颜色可根据显示设置),请看如下效果图:
很明显这样还是不够的,其中所指位置是需要修补的区域,利用drawPolygon或者drawRect函数画所指区域即可实现修补。具体修补区域的每个点的坐标,可根据椭圆的参数方程x=acost,y=bsint(a,b分别为长短半径,t为离心角)和各个扇形的startAgl,spanAgl算出,修补后的效果图如下图所示:
这样,即可实现3d
静态饼状图效果。
部分代码如下(测试用的,写的很乱:) ):
void Myclass::paintEvent(QPaintEvent *event)
{
// test 3D pie
QPainter painter;
painter.begin(this);
painter.setRenderHint(QPainter::Antialiasing, true); // 设置边缘光滑
const int iRectX = 300; // left pie pos
const int iRectY = 300;
const int iRectW = 280;
const int iRectH = 200;
const double pi = 3.1415926;
const int iSpanRed = 270;
const int iSpanAglGreen = 15;
const int iSpanAglBlue = 30;
const int iSpanAglYellow = 45;
const int iStartRed = 60;
const int iStartAglGreen = -(360-iSpanRed-iStartRed);
const int iStartAglBlue = -(-iStartAglGreen-iSpanAglGreen);
const int iStartAglYellow = iStartAglBlue + iSpanAglYellow;
// painter pie
QRect rect(iRectX, iRectY, iRectW, iRectH); // 左下方扇形
QRect rectUp(iRectX, iRectY-20, iRectW, iRectH); // 左上方扇形
QRect rectRt(iRectX+20, iRectY, iRectW, iRectH); // 右下方扇形
QRect rectRtUp(iRectX+20, iRectY-20, iRectW, iRectH); // 右上方扇形
int startAngleRed = iStartRed * 16;
int spanAngleRed = iSpanRed * 16;
int startAngleGreen = iStartAglGreen * 16;
int spanAngleGreen = iSpanAglGreen * 16;
int startAngleBlue = iStartAglYellow * 16;
int spanAngleBlue = iSpanAglBlue * 16;
int startAngleYellow = iStartAglBlue * 16;