
// Scatter3DDemo.java
// Andrew Davison, ad@coe.psu.ac.th, Feb. 2023

/* Plot NUM_POINTS random coords using their coordinates 
   (between 0 and 1) as their RGB colors.

   The plot is displayed inside a JPanel in a JFrame.

   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 Scatter3DDemo.java
   > run Scatter3DDemo
*/

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.primitives.axis.layout.renderers.*;

import org.jzy3d.plot3d.rendering.canvas.*;

import org.jzy3d.painters.*;

import org.jzy3d.maths.*;




public class Scatter3DDemo extends JPanel
{
  // dimensions of the panel
  private static final int P_WIDTH = 700;
  private static final int P_HEIGHT = 600;

  private static final int NUM_POINTS = 500000;  // in the scatter plot


  public Scatter3DDemo()
  {
    setLayout( new BorderLayout());
    setPreferredSize(new java.awt.Dimension(P_WIDTH, P_HEIGHT));

    Random rand = new Random();
    Coord3d[] coords = new Coord3d[NUM_POINTS];
    Color[] colors = new Color[NUM_POINTS];

    // create random scatter plot data
    float x, y, z;
    for(int i = 0; i < NUM_POINTS; i++) {
      x = rand.nextFloat();
      y = rand.nextFloat();
      z = rand.nextFloat();
      coords[i] = new Coord3d(x, y, z);  
      colors[i] = new Color(x, y, z, 0.25f);
                // use coordinates as semi-transparent colors
    }
    Scatter scatter = new Scatter(coords, colors);

    // create the chart
    IChartFactory factory = new SwingChartFactory();
    Chart chart = factory.newChart(Quality.Advanced());
    chart.getScene().getGraph().add(scatter);

    // modify the chart axes
    AxisLayout axl = chart.getAxisLayout();
    axl.setFont(Font.Helvetica_18);
    axl.setMainColor(Color.GRAY);

    FixedDecimalTickRenderer ren2dp = 
                new FixedDecimalTickRenderer(2);  // 2 dp
    axl.setXTickRenderer(ren2dp);
    axl.setYTickRenderer(ren2dp);
    axl.setZTickRenderer(ren2dp);

    // add user viewing controls
    chart.addMouse();
    chart.addKeyboard();

    add((JPanel)chart.getCanvas(), BorderLayout.CENTER);
  } // end of Scatter3DDemo()



  // -------------------------------------------

  public static void main(String[] args)
  {
    JFrame f = new JFrame("Scatter3DDemo");
    f.getContentPane().add(new Scatter3DDemo());

    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.setResizable(false);
    f.setVisible(true);
  } // end of main()



}  // end of Scatter3DDemo class