Example #1
0
void Plot3D::setData()
{
    int dimX = data->getX().count();
    int dimY = data->getY().count();

    //create Triples
    triple = new Qwt3D::Triple * [data->getX().count()];
    double maxX = data->getX().at(0).toDouble();
    double maxY = data->getY().at(0).toDouble();
    double maxZ = data->getZ().at(0).toDouble();
    double minX = data->getX().at(0).toDouble();
    double minY = data->getY().at(0).toDouble();
    double minZ = data->getZ().at(0).toDouble();
    double dblX, dblY, dblZ;
    for (int i = 0; i < dimX; i++)
    {
        dblX = data->getX(i).toDouble();
        if (dblX > maxX)
            maxX = dblX;
        if (dblX < minX)
            minX = dblX;

        triple[i] = new Qwt3D::Triple[dimY];
        for (int j = 0; j < dimY; j++)
        {
            if (i == 0)
            {
                dblY = data->getY(j).toDouble();
                if (dblY > maxY)
                    maxY = dblY;
                if (dblY < minY)
                    minY = dblY;
            }

            dblZ = data->getZ(i * dimY + j).toDouble();
            if (dblZ > maxZ)
                maxZ = dblZ;
            if (dblZ < minZ)
                minZ = dblZ;

            triple[i][j] = Qwt3D::Triple(data->getX(i).toDouble(),
                                        data->getY(j).toDouble(),
                                        data->getZ(j,i).toDouble());
        }
    }

    //calculate scaling factors
    double rangeX = abs(maxX - minX);
    double rangeY = abs(maxY - minY);
    double rangeZ = abs(maxZ - minZ);
    double facX = 1;
    double facY = 1;
    double facZ = 1;

    if (rangeX > rangeY && rangeX > rangeZ)
    {
        if (rangeY > 0)
            facY = rangeX / rangeY;
        if (rangeZ > 0)
            facZ = rangeX / rangeZ;
    }
    else if (rangeY > rangeX && rangeY > rangeZ)
    {
        if (rangeX > 0)
            facX = rangeY / rangeX;
        if (rangeZ > 0)
            facZ = rangeY / rangeZ;
    }
    else if (rangeZ > rangeX && rangeZ > rangeY)
    {
        if (rangeX > 0)
            facX = rangeZ / rangeX;
        if (rangeY > 0)
            facY = rangeZ / rangeY;
    }

    //create surface
    surface = new Qwt3D::SurfacePlot;
    setCentralWidget(surface);
    surface->setTitle(data->getName() + " [" + data->getUnit() + "]");

    surface->loadFromData(triple, dimX, dimY);
    surface->setCoordinateStyle(Qwt3D::BOX);

    surface->setRotation(15,0,20);
    surface->setScale(facX, facY, facZ);
    surface->setZoom(0.6);
    surface->setPlotStyle(Qwt3D::FILLEDMESH);
    surface->setMeshColor(Qwt3D::RGBA(0.2f,0.7f,0.3f));

    QFont font;
    font.setItalic(true);
    for (unsigned i=0; i!=surface->coordinates()->axes.size(); ++i)
    {
      surface->coordinates()->axes[i].setMajors(7);
      surface->coordinates()->axes[i].setMinors(4);
      surface->coordinates()->axes[i].setLabelFont(font);
    }

    // Set axisX titles
    AXIS_DESCR *axisX = data->getAxisDescrX();
    COMPU_METHOD *cpmX = data->getCompuMethodAxisX();
    QString name = "";
    if (axisX)
        name.append(axisX->fixPar("InputQuantity").c_str());
    QString unit = "";
    if (cpmX)
        unit.append(cpmX->fixPar("Unit").c_str());
    QString titleX =  name + " - " + unit;
    surface->coordinates()->axes[Qwt3D::X1].setLabelString(titleX);

    // Set axisY titles
    AXIS_DESCR *axisY = data->getAxisDescrY();
    COMPU_METHOD *cpmY = data->getCompuMethodAxisY();
    name = "";
    if (axisY)
        name.append(axisY->fixPar("InputQuantity").c_str());
    unit = "";
    if (cpmY)
        unit.append(cpmY->fixPar("Unit").c_str());
    QString titleY =  name + " - " + unit;
    surface->coordinates()->axes[Qwt3D::Y1].setLabelString(titleY);

    //surface->coordinates()->axes[Qwt3D::Z1].setLabelString("z-axis");

    surface->coordinates()->setTicLength(0 , 0);

    surface->updateData();
    surface->updateGL();
    surface->show();

}
Example #2
0
int Foo::Draw(mglGraph *gr)
{
    int dimX = data->getX().count();
    mglData x(dimX);
    int dimY = data->getY().count();
    mglData y(dimY);
    mglData z(dimX,dimY);

    //create datas for mathGL
    double maxX = data->getX().at(0).toDouble();
    double maxY = data->getY().at(0).toDouble();
    double maxZ = data->getZ().at(0).toDouble();
    double minX = data->getX().at(0).toDouble();
    double minY = data->getY().at(0).toDouble();
    double minZ = data->getZ().at(0).toDouble();

    //added for flap map to be displayed
    if (maxZ == minZ)
    {
        minZ -= 10;
        maxZ += 10;
    }

    double dblX, dblY, dblZ;
    for (int i = 0; i < dimX; i++)
    {
        dblX = data->getX(i).toDouble();
        if (dblX > maxX)
            maxX = dblX;
        if (dblX < minX)
            minX = dblX;
        x.a[i] = dblX;
    }

    for (int j = 0; j < dimY; j++)
    {
        dblY = data->getY(j).toDouble();
        if (dblY > maxY)
            maxY = dblY;
        if (dblY < minY)
            minY = dblY;
        y.a[j] = dblY;
    }

    for(long i=0;i<dimX;i++)
    {
        for(long j=0;j<dimY;j++)
        {
            dblZ = data->getZ(i * dimY + j).toDouble();
            if (dblZ > maxZ)
                maxZ = dblZ;
            if (dblZ < minZ)
                minZ = dblZ;
             z.a[i+dimX*j] = dblZ;
        }
    }

     QString title = data->getName() + " [" + data->getUnit() + "]";
     title.replace("_", "_-");
     gr->SetFontSize(2);
     gr->Title(title.toLocal8Bit(), "");

     gr->SetRange('x', minX, maxX);
     gr->SetRange('y',minY ,maxY);
     gr->SetRange('z',minZ,maxZ);
     gr->SetRange('c',minZ,maxZ);

     gr->Light(true);
     gr->Rotate(70,30);
     gr->Axis();
     gr->Box();

     // Set axisX titles
     AXIS_DESCR *axisX = data->getAxisDescrX();
     COMPU_METHOD *cpmX = data->getCompuMethodAxisX();
     QString name = "";
     if (axisX)
         name.append(axisX->fixPar("InputQuantity").c_str());
     QString unit = "";
     if (cpmX)
         unit.append(cpmX->fixPar("Unit").c_str());
     QString titleX =  name + " - " + unit;
     gr->Label('x',QString(titleX).toLatin1(),0);

     // Set axisY titles
     AXIS_DESCR *axisY = data->getAxisDescrY();
     COMPU_METHOD *cpmY = data->getCompuMethodAxisY();
     name = "";
     if (axisY)
         name.append(axisY->fixPar("InputQuantity").c_str());
     unit = "";
     if (cpmY)
         unit.append(cpmY->fixPar("Unit").c_str());
     QString titleY =  name + " - " + unit;
     gr->Label('y', QString(titleY).toLatin1(),0);

     //gr->Label('z',"AxisY description \\i{cm}",0);

     gr->Colorbar();
     gr->Mesh(x,y,z);
     gr->Surf(x,y,z);

     return 0;
}