Постройте трехмерный график поверхности, используя координаты XYZ с помощью JZ3 - PullRequest
2 голосов
/ 01 декабря 2011

Я искал способ отправить список координат (x, y, z) на jzy3d. Но без успеха.

Единственный способ, который я нашел, - это использовать "строитель" со списком "ordin3D "и" Тесселатор ", но на самом деле он не работает.

На самом деле я не понимаю значения Тесселатора?

Вот код, который я пробовал:

public Chart getChart(){

    List<Coord3d> coordinates = new ArrayList<Coord3d>();
    for(int i=0; i<200; i++)
        coordinates.add( new Coord3d(5, 10, 15) );
    Tesselator tesselator = new Tesselator() {          
        @Override
        public AbstractComposite build(float[] x, float[] y, float[] z) {
            return null;
        }
    };      
    tesselator.build(coordinates);
     org.jzy3d.plot3d.primitives.Shape surface = (Shape)Builder.build(coordinates, tesselator);


/*/ Define a function to plot
  Mapper mapper = new Mapper(){
     public double f(double x, double y) {
        return 10*Math.sin(x/10)*Math.cos(y/20)*x;
     }
  };*/

  // Define range and precision for the function to plot
 // Range range = new Range(-150,150);
 // int steps   = 50;

  // Create the object to represent the function over the given range.
 // org.jzy3d.plot3d.primitives.Shape surface = (Shape)Builder.buildOrthonormal(new OrthonormalGrid(range, steps, range, steps), mapper);
  //surface.setColorMapper(new ColorMapper(new ColorMapRainbow(), surface.getBounds().getZmin(), surface.getBounds().getZmax(), new Color(1,1,1,.5f)));
 // surface.setWireframeDisplayed(true);
//  surface.setWireframeColor(Color.BLACK);
  //surface.setFace(new ColorbarFace(surface));
  //surface.setFaceDisplayed(true);
  //surface.setFace2dDisplayed(true); // opens a colorbar on the right part of the display

  // Create a chart
  Chart chart = new Chart("swing");
  chart.getScene().getGraph().add(surface);
  return chart;
}

Может кто-нибудь сказать мне, как снабдить мой график множеством координат XYZ, чтобы я мог получить трехмерный график поверхности, подобный этому:

3D-график поверхности http://martin.pernollet.free.fr/cv/projects/jzy3d/demo_surface.jpg

1 Ответ

4 голосов
/ 01 декабря 2011

Тесселятор позволяет создавать полигоны из списка точек. Jzy3d предоставляет два базовых тесселятора: один, который поддерживает точки, стоящие на регулярной сетке (называемой OrthonormalTesselator), другой, который поддерживает неструктурированные точки в качестве входных данных (DelaunayTesselator). Второй не всегда «работает хорошо»: не проблема, связанная с его реализацией, а главным образом тот факт, что трудно решить, как точки должны работать вместе, чтобы сформировать многоугольник в 3d. Вы можете найти некоторые обсуждения по этому поводу в вики и дискуссионных группах Jzy3d.

Чтобы вручную построить полигоны, вот что вы должны сделать:

// Build a polygon list
    double [][]distDataProp = new double[][] {{.25,.45, .20},{.56, .89, .45}, {.6, .3,.7}};
    List<Polygon> polygons = new ArrayList<Polygon>();
    for(int i = 0; i < distDataProp.length -1; i++){
        for(int j = 0; j < distDataProp[i].length -1; j++){
            Polygon polygon = new Polygon();
            polygon.add(new Point( new Coord3d(i, j, distDataProp[i][j]) ));
            polygon.add(new Point( new Coord3d(i, j+1, distDataProp[i][j+1]) ));
            polygon.add(new Point( new Coord3d(i+1, j+1, distDataProp[i+1][j+1]) ));
            polygon.add(new Point( new Coord3d(i+1, j, distDataProp[i+1][j]) ));
            polygons.add(polygon);
        }
    }

    // Creates the 3d object
    Shape surface = new Shape(polygons);
    surface.setColorMapper(new ColorMapper(new ColorMapRainbow(), surface.getBounds().getZmin(), surface.getBounds().getZmax(), new org.jzy3d.colors.Color(1,1,1,1f)));
    surface.setWireframeDisplayed(true);
    surface.setWireframeColor(org.jzy3d.colors.Color.BLACK);

    chart = new Chart();
    chart.getScene().getGraph().add(surface);
...