
// Histogram3DDemo.java
// Andrew Davison, ad@coe.psu.ac.th, Feb. 2023

/* Plot NUM_BARS x NUM_BARS histogram bars with a random
   height (between 0 and 100) and a random color.
   The bars are spaced out at intervals of 50 units across 
   the (x,y) plane.

   Using Jzy3d 2.2.0 (http://www.jzy3d.org/)

   Based on an example at:
   https://www.doc.jzy3d.org/guide/docs/getting-started-charts.html

   Usage:
   > compile Histogram3DDemo.java
   > run Histogram3DDemo
*/

import java.awt.BorderLayout;
import javax.swing.*;
import java.util.Random;

import org.jzy3d.chart.*;
import org.jzy3d.chart.factories.*;
import org.jzy3d.chart.controllers.mouse.camera.*;
import org.jzy3d.chart.controllers.keyboard.camera.*;

import org.jzy3d.colors.*;
import org.jzy3d.colors.colormaps.*;

import org.jzy3d.plot3d.builder.*;
import org.jzy3d.plot3d.builder.concrete.*;

import org.jzy3d.plot3d.primitives.*;
import org.jzy3d.plot3d.primitives.axis.layout.*;

import org.jzy3d.plot3d.rendering.scene.*;
import org.jzy3d.plot3d.rendering.canvas.*;
import org.jzy3d.plot3d.rendering.view.*;

import org.jzy3d.painters.*;

import org.jzy3d.maths.*;



public class Histogram3DDemo extends JPanel
{
  // dimensions of the panel
  private static final int P_WIDTH = 700;
  private static final int P_HEIGHT = 600;

  // display NUM_BARS x NUM_BARS bars 
  private static final int NUM_BARS = 4; 
  private static final int OFFSET = 50;  // for positioning the bars

  public Histogram3DDemo()
  {
    setLayout( new BorderLayout());
    setPreferredSize(new java.awt.Dimension(P_WIDTH, P_HEIGHT));

    // create the chart
    IChartFactory factory = new SwingChartFactory();
    Chart chart = factory.newChart(Quality.Advanced());
    Scene scene = chart.getScene();

    // generate bars
    Random rand = new Random();
    for(int i=0; i < NUM_BARS; i++)
      for(int j=0; j < NUM_BARS; j++)
        scene.add( makeBar(i*OFFSET, j*OFFSET, rand.nextInt(100)) );

    // modify the chart axes
    AxisLayout axl = chart.getAxisLayout();
    axl.setFont(Font.Helvetica_18);
    axl.setMainColor(Color.GRAY);

    // add user viewing controls
    chart.addMouse();
    chart.addKeyboard();

    add((JPanel)chart.getCanvas(), BorderLayout.CENTER);
  } // end of Histogram3DDemo()


  private Drawable makeBar(double x, double y, float height)
  /* generate a bar at (x,y) of the specified height with
     a radius == 10, and a random color
  */
  { Color color = new RandomGeom().color();
    color.a = 0.5f;  // semi-transparent
    
    HistogramBar bar = new HistogramBar();
    bar.setData(new Coord3d(x, y, 0), height, 10, color);
    bar.setWireframeDisplayed(false);  // necessary or image is corrupted

    return bar;
  }  // end of makeBar()


  // -------------------------------------------

  public static void main(String[] args)
  {
    JFrame f = new JFrame("Histogram3DDemo");
    f.getContentPane().add(new Histogram3DDemo());

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.setResizable(false);
    f.setVisible(true);
  } // end of main()

}  // end of Histogram3DDemo class