#include <math.h>
#include "gpiechart.h"

gPieChart::gPieChart(gPointData *d,QColor col)
:gLayer(d)
{
    color.clear();
    color.push_back(col);
}
gPieChart::~gPieChart()
{
}

void gPieChart::Plot(gGraphWindow & w,float scrx,float scry)
{
    if (!m_visible) return;
    if (!data) return;
    if (!data->IsReady()) return;

    int start_px=w.GetLeftMargin();
    int start_py=w.GetBottomMargin();
    int width=scrx-(w.GetLeftMargin()+w.GetRightMargin());
    int height=scry-(w.GetTopMargin()+w.GetBottomMargin());

    float diameter=MIN(width,height);
    diameter-=8;
    float radius=diameter/2.0;

    double total=0;
    for (int i=0;i<data->np[0];i++)
        total+=data->point[0][i].y();


    double j=0.0;
    double sum=0.0;
    double step=1.0/45.0;
    float px,py;
    //glEnable(GL_TEXTURE_2D);
    //glEnable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    //glEnable(GL_POLYGON_SMOOTH);
    glEnable(GL_LINE_SMOOTH);
    glLineWidth(1.5);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    //glBlendFunc( GL_SRC_ALPHA_SATURATE, GL_ONE );
    //glHint(GL_POLYGON_SMOOTH_HINT,  GL_NICEST);

    for (int i=0;i<data->np[0];i++) {
        j=(data->point[0][i].y()/total); // ratio of this pie slice
        QColor col1=color[i % color.size()];
        w.qglColor(col1);
        glPolygonMode(GL_BACK,GL_FILL);
        glBegin(GL_POLYGON);
        glVertex2f(start_px+radius+4, start_py+radius+4);
        double q;
        for (q=sum;q<sum+j;q+=step) {
            px=start_px+radius+4+sin(q*2*M_PI)*radius;
            py=start_py+radius+4+cos(q*2*M_PI)*radius;
            glVertex2f(px,py);
        }
        q=sum+j;
        px=start_px+radius+4+sin(q*2*M_PI)*radius;
        py=start_py+radius+4+cos(q*2*M_PI)*radius;
        glVertex2f(px,py);
        glEnd();

        glPolygonMode(GL_BACK,GL_LINE);
        w.qglColor(Qt::black);
        glBegin(GL_POLYGON);
        glVertex2f(start_px+radius+4, start_py+radius+4);
        for (q=sum;q<sum+j;q+=step) {
            px=start_px+radius+4+sin(q*2*M_PI)*radius;
            py=start_py+radius+4+cos(q*2*M_PI)*radius;
            glVertex2f(px,py);
        }
        q=sum+j;
        px=start_px+radius+4+sin(q*2*M_PI)*radius;
        py=start_py+radius+4+cos(q*2*M_PI)*radius;
        glVertex2f(px,py);
        glEnd();


        sum=q;
    }
    glDisable(GL_POLYGON_SMOOTH);
    glDisable(GL_BLEND);
    //glDisable(GL_DEPTH_TEST);
    //glDisable(GL_TEXTURE_2D);
}