//--------------------------------------------------------------------------
// Copyright (C) 2001  Geoffrey Furnish
// Copyright (C) 2001-2014 Alan W. Irwin
// Copyright (C) 2004  Andrew Ross
//
// This file is part of PLplot.
//
// PLplot is free software; you can redistribute it and/or modify
// it under the terms of the GNU Library General Public License as published by
// the Free Software Foundation; version 2 of the License.
//
// PLplot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public License
// along with PLplot; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
//--------------------------------------------------------------------------

//--------------------------------------------------------------------------
// Implementation of PLplot example 11 in Java.
//--------------------------------------------------------------------------

package plplot.examples;

import plplot.core.*;
import static plplot.core.plplotjavacConstants.*;

import java.lang.Math;

class x11 {
    PLStream         pls = new PLStream();

    static final int XPTS   = 35;
    static final int YPTS   = 46;
    static final int LEVELS = 10;

    static int       opt[] = { 3, 3 };
    static double    alt[] = { 33.0, 17.0 };
    static double    az[]  = { 24.0, 115.0 };

    static           String[] title =
    {
        "#frPLplot Example 11 - Alt=33, Az=24, Opt=3",
        "#frPLplot Example 11 - Alt=17, Az=115, Opt=3"
    };

    void cmap1_init()
    {
        double [] i    = new double[2];
        double [] h    = new double[2];
        double [] l    = new double[2];
        double [] s    = new double[2];
        boolean [] rev = new boolean[2];

        i[0] = 0.0;         // left boundary
        i[1] = 1.0;         // right boundary

        h[0] = 240;         // blue -> green -> yellow ->
        h[1] = 0;           // -> red

        l[0] = 0.6;
        l[1] = 0.6;

        s[0] = 0.8;
        s[1] = 0.8;

        rev[0] = false;         // interpolate on front side of colour wheel.
        rev[1] = false;         // interpolate on front side of colour wheel.

        pls.scmap1n( 256 );
        pls.scmap1l( false, i, h, l, s, rev );
    }

// Does a series of mesh plots for a given data set, with different viewing
// options in each plot.

    public static void main( String[] args )
    {
        new x11( args );
    }

    public x11( String[] args )
    {
        int i, j, k;

        double[] x   = new double[ XPTS ];
        double[] y   = new double[ YPTS ];
        double[][] z = new double[XPTS][YPTS];
        double zmin = Double.MAX_VALUE, zmax = Double.MIN_VALUE;

        double xx, yy;
        int    nlevel = LEVELS;
        double[] clevel = new double[LEVELS];
        double step;


        // Parse and process command line arguments.

        pls.parseopts( args, PL_PARSE_FULL | PL_PARSE_NOPROGRAM );

        // Initialize plplot.

        pls.init();

        for ( i = 0; i < XPTS; i++ )
            x[i] = 3. * ( i - ( XPTS / 2 ) ) / ( XPTS / 2 );

        for ( j = 0; j < YPTS; j++ )
            y[j] = 3. * ( j - ( YPTS / 2 ) ) / ( YPTS / 2 );

        for ( i = 0; i < XPTS; i++ )
        {
            xx = x[i];
            for ( j = 0; j < YPTS; j++ )
            {
                yy      = y[j];
                z[i][j] = 3. * ( 1. - xx ) * ( 1. - xx ) * Math.exp( -( xx * xx ) - ( yy + 1. ) * ( yy + 1. ) ) -
                          10. * ( xx / 5. - Math.pow( xx, 3. ) - Math.pow( yy, 5. ) ) * Math.exp( -xx * xx - yy * yy ) -
                          1. / 3. * Math.exp( -( xx + 1 ) * ( xx + 1 ) - ( yy * yy ) );
                //if ( false ) // Jungfraujoch/Interlaken
                //{
                //    if ( z[i][j] < -1. )
                //        z[i][j] = -1.;
                //}
                if ( zmin > z[i][j] )
                    zmin = z[i][j];
                if ( zmax < z[i][j] )
                    zmax = z[i][j];
            }
        }

        step = ( zmax - zmin ) / ( nlevel + 1 );
        for ( i = 0; i < nlevel; i++ )
            clevel[i] = zmin + step + step * i;

        cmap1_init();
        for ( k = 0; k < 2; k++ )
        {
            for ( i = 0; i < 4; i++ )
            {
                pls.adv( 0 );
                pls.col0( 1 );
                pls.vpor( 0.0, 1.0, 0.0, 0.9 );
                pls.wind( -1.0, 1.0, -1.0, 1.5 );

                pls.w3d( 1.0, 1.0, 1.2, -3.0, 3.0, -3.0, 3.0, zmin, zmax,
                    alt[k], az[k] );
                pls.box3( "bnstu", "x axis", 0.0, 0,
                    "bnstu", "y axis", 0.0, 0,
                    "bcdmnstuv", "z axis", 0.0, 4 );

                pls.col0( 2 );

                // wireframe plot
                if ( i == 0 )
                    pls.mesh( x, y, z, opt[k] );

                // magnitude colored wireframe plot
                else if ( i == 1 )
                    pls.mesh( x, y, z, opt[k] | MAG_COLOR );

                // magnitude colored wireframe plot with sides
                else if ( i == 2 )
                    pls.plot3d( x, y, z, opt[k] | MAG_COLOR, true );

                // magnitude colored wireframe plot with base contour
                else if ( i == 3 )
                    pls.meshc( x, y, z, opt[k] | MAG_COLOR | BASE_CONT,
                        clevel );


                pls.col0( 3 );
                pls.mtex( "t", 1.0, 0.5, 0.5, title[k] );
            }
        }

        pls.end();
    }
}

//--------------------------------------------------------------------------
//                              End of x11.java
//--------------------------------------------------------------------------
