package org.jzy3d.io.matlab;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.jzy3d.io.ILoader;
import org.jzy3d.maths.Coord3d;
import org.jzy3d.maths.TicToc;
import org.jzy3d.plot3d.primitives.AbstractDrawable;
import org.jzy3d.plot3d.primitives.Point;
import org.jzy3d.plot3d.primitives.enlightables.EnlightablePolygon;

import com.jmatio.io.MatFileReader;
import com.jmatio.types.MLNumericArray;

/**
 * Load a Matlab (TM) .mat file, assuming it contains at least three arrays named
 * "X", "Y" and "Z". 
 * 
 * Returns a list of {@link EnlightablePolygon} which allow a an easier visualization 
 * of shapes made of a large number of single-colored polygons.
 * 
 * For very large file, {@link MatlabVBOLoader} are preferred.
 * 
 * @author Martin Pernollet
 */
public class MatlabDrawableLoader implements ILoader {
    @Override
    public List load(String filename) throws Exception {
        return load(filename, -1);
    }
    
    @SuppressWarnings("unchecked")
    public List load(String filename, int limit) throws Exception {
        TicToc t = new TicToc();
        t.tic();
        MatFileReader mfr = new MatFileReader(filename);
        Logger.getLogger(MatlabDrawableLoader.class).info(t.toc() + " to read " + filename);
        Logger.getLogger(MatlabDrawableLoader.class).info("Containing arrays: " + mfr.getContent().keySet());

        MLNumericArray x = (MLNumericArray) mfr.getMLArray("X");
        MLNumericArray y = (MLNumericArray) mfr.getMLArray("Y");
        MLNumericArray z = (MLNumericArray) mfr.getMLArray("Z");

        List polygons = new ArrayList();

        int n = x.getN();
        if (limit > 0)
            n = Math.min(n, limit);

        t.tic();
        for (int i = 0; i < n; i++) {
            try {
                Coord3d coord1 = new Coord3d(x.getReal(C1, i), y.getReal(C1, i), z.getReal(C1, i));
                Coord3d coord2 = new Coord3d(x.getReal(C2, i), y.getReal(C2, i), z.getReal(C2, i));
                Coord3d coord3 = new Coord3d(x.getReal(C3, i), y.getReal(C3, i), z.getReal(C3, i));

                Point point1 = new Point(coord1);
                Point point2 = new Point(coord2);
                Point point3 = new Point(coord3);

                EnlightablePolygon polygon = new EnlightablePolygon();
                polygon.add(point1);
                polygon.add(point2);
                polygon.add(point3);

                polygons.add(polygon);
            } catch (Exception e) {
                throw new Exception("failed at line " + i + "/" + n, e);
            }
        }
        Logger.getLogger(MatlabDrawableLoader.class).info(t.toc() + " to build polygon list");
        return polygons;
    }
    
    protected static int C1 = 0;
    protected static int C2 = 1;
    protected static int C3 = 2;

}

 

Ads help maintain this website.