- * Adapted from Yury Petrov's Ellipsoid
- * Fit MATLAB function and KalebKE ellipsoidfit.
- *
- * @author Jean-Yves Tinevez
- */
-public class EllipsoidFitter
-{
-
- /**
- * The results of fitting an ellpsoid to a mesh or a collection of points.
- */
- public static final class EllipsoidFit
- {
- /** The ellipsoid center. */
- public final RealLocalizable center;
-
- /** The eigenvector of the smallest axis of the ellipsoid. */
- public final RealLocalizable ev1;
-
- /** The eigenvector of the middle axis of the ellipsoid. */
- public final RealLocalizable ev2;
-
- /** The eigenvector of the largest axis of the ellipsoid. */
- public final RealLocalizable ev3;
-
- /** The radius of the smallest axis of the ellipsoid. */
- public final double r1;
-
- /** The radius of the middle axis of the ellipsoid. */
- public final double r2;
-
- /** The radius of the largest axis of the ellipsoid. */
- public final double r3;
-
- private EllipsoidFit( final RealLocalizable center,
- final RealLocalizable ev1,
- final RealLocalizable ev2,
- final RealLocalizable ev3,
- final double r1,
- final double r2,
- final double r3 )
- {
- this.center = center;
- this.ev1 = ev1;
- this.ev2 = ev2;
- this.ev3 = ev3;
- this.r1 = r1;
- this.r2 = r2;
- this.r3 = r3;
- }
-
- @Override
- public String toString()
- {
- final StringBuilder str = new StringBuilder( super.toString() );
- str.append( "\n - center: " + Util.printCoordinates( center ) );
- str.append( String.format( "\n - axis 1: radius = %.2f, vector = %s", r1, ev1 ) );
- str.append( String.format( "\n - axis 2: radius = %.2f, vector = %s", r2, ev2 ) );
- str.append( String.format( "\n - axis 3: radius = %.2f, vector = %s", r3, ev3 ) );
- return str.toString();
- }
- }
-
- private static final DefaultConvexHull3D cHull = new DefaultConvexHull3D();
-
- /**
- * Fit an ellipsoid to the convex-Hull of a 3D mesh.
- *
- * @param mesh
- * the mesh to fit.
- * @return the fit results.
- */
- public static final EllipsoidFit fit( final Mesh mesh )
- {
- final Mesh ch = cHull.calculate( mesh );
- return fitOnConvexHull( ch );
- }
-
- /**
- * Fit an ellipsoid to a 3D mesh, assuming it is the convex-Hull.
- *
- * @param mesh
- * the convex-Hull of the mesh to fit.
- * @return the fit results.
- */
- public static final EllipsoidFit fitOnConvexHull( final Mesh mesh )
- {
- return fit( mesh.vertices(), ( int ) mesh.vertices().size() );
- }
-
- /**
- * Fit an ellipsoid to a collection of 3D points.
- *
- * @param points
- * an iterable over the points to fit.
- * @param nPoints
- * the number of points to include in the fit. The fit will
- * consider at most the first nPoints of the iterable, or all the
- * points in the iterable, whatever comes first.
- * @return the fit results.
- */
- public static EllipsoidFit fit( final Iterable< ? extends RealLocalizable > points, final int nPoints )
- {
- final RealVector V = solve( points, nPoints );
-
- // To algebraix form.
- final RealMatrix A = toAlgebraicForm( V );
-
- // Find the center of the ellipsoid.
- final RealVector C = findCenter( A );
-
- // Translate the algebraic form of the ellipsoid to the center.
- final RealMatrix R = translateToCenter( C, A );
-
- // Ellipsoid eigenvectors and eigenvalues.
- final EllipsoidFit fit = getFit( R, C );
- return fit;
- }
-
- private static EllipsoidFit getFit( final RealMatrix R, final RealVector C )
- {
- final RealMatrix subr = R.getSubMatrix( 0, 2, 0, 2 );
-
- // subr[i][j] = subr[i][j] / -r[3][3]).
- final double divr = -R.getEntry( 3, 3 );
- for ( int i = 0; i < subr.getRowDimension(); i++ )
- for ( int j = 0; j < subr.getRowDimension(); j++ )
- subr.setEntry( i, j, subr.getEntry( i, j ) / divr );
-
- // Get the eigenvalues and eigenvectors.
- final EigenDecomposition ed = new EigenDecomposition( subr );
- final double[] eigenvalues = ed.getRealEigenvalues();
- final RealVector e1 = ed.getEigenvector( 0 );
- final RealVector e2 = ed.getEigenvector( 1 );
- final RealVector e3 = ed.getEigenvector( 2 );
-
- // Semi-axis length (radius).
- final RealVector SAL = new ArrayRealVector( eigenvalues.length );
- for ( int i = 0; i < eigenvalues.length; i++ )
- SAL.setEntry( i, Math.sqrt( 1. / eigenvalues[ i ] ) );
-
- // Put everything in a fit object.
- final RealPoint center = new RealPoint( C.getEntry( 0 ), C.getEntry( 1 ), C.getEntry( 2 ) );
- final RealPoint ev1 = new RealPoint( e1.getEntry( 0 ), e1.getEntry( 1 ), e1.getEntry( 2 ) );
- final RealPoint ev2 = new RealPoint( e2.getEntry( 0 ), e2.getEntry( 1 ), e2.getEntry( 2 ) );
- final RealPoint ev3 = new RealPoint( e3.getEntry( 0 ), e3.getEntry( 1 ), e3.getEntry( 2 ) );
- return new EllipsoidFit( center, ev1, ev2, ev3, SAL.getEntry( 0 ), SAL.getEntry( 1 ), SAL.getEntry( 2 ) );
- }
-
- /**
- * Translate the algebraic form of the ellipsoid to the center.
- *
- * @param C
- * the center of the ellipsoid.
- * @param A
- * the ellipsoid matrix.
- * @return the center translated form of the algebraic ellipsoid.
- */
- private static final RealMatrix translateToCenter( final RealVector C, final RealMatrix A )
- {
- final RealMatrix T = MatrixUtils.createRealIdentityMatrix( 4 );
- final RealMatrix centerMatrix = new Array2DRowRealMatrix( 1, 3 );
- centerMatrix.setRowVector( 0, C );
- T.setSubMatrix( centerMatrix.getData(), 3, 0 );
- final RealMatrix R = T.multiply( A ).multiply( T.transpose() );
- return R;
- }
-
- /**
- * Find the center of the ellipsoid.
- *
- * @param a
- * the algebraic from of the polynomial.
- * @return a vector containing the center of the ellipsoid.
- */
- private static final RealVector findCenter( final RealMatrix A )
- {
- final RealMatrix subA = A.getSubMatrix( 0, 2, 0, 2 );
-
- for ( int q = 0; q < subA.getRowDimension(); q++ )
- for ( int s = 0; s < subA.getColumnDimension(); s++ )
- subA.multiplyEntry( q, s, -1.0 );
-
- final RealVector subV = A.getRowVector( 3 ).getSubVector( 0, 3 );
-
- final DecompositionSolver solver = new SingularValueDecomposition( subA ).getSolver();
- final RealMatrix subAi = solver.getInverse();
- return subAi.operate( subV );
- }
-
- /**
- * Solve for Ax^2 + By^2 + Cz^2 + 2Dxy + 2Exz + 2Fyz + 2Gx + 2Hy +
- * 2Iz = 1
.
- *
- * @param points
- * an iterable over 3D points.
- * @param nPoints
- * the number of points in the iterable.
- * @return
- */
- private static final RealVector solve( final Iterable< ? extends RealLocalizable > points, final int nPoints )
- {
- final RealMatrix M0 = new Array2DRowRealMatrix( nPoints, 9 );
- int i = 0;
- for ( final RealLocalizable point : points )
- {
- final double x = point.getDoublePosition( 0 );
- final double y = point.getDoublePosition( 1 );
- final double z = point.getDoublePosition( 2 );
-
- final double xx = x * x;
- final double yy = y * y;
- final double zz = z * z;
-
- final double xy = 2. * x * y;
- final double xz = 2. * x * z;
- final double yz = 2. * y * z;
-
- M0.setEntry( i, 0, xx );
- M0.setEntry( i, 1, yy );
- M0.setEntry( i, 2, zz );
- M0.setEntry( i, 3, xy );
- M0.setEntry( i, 4, xz );
- M0.setEntry( i, 5, yz );
- M0.setEntry( i, 6, 2. * x );
- M0.setEntry( i, 7, 2. * y );
- M0.setEntry( i, 8, 2. * z );
-
- i++;
- if ( i >= nPoints )
- break;
- }
- final RealMatrix M;
- if ( i == nPoints )
- M = M0;
- else
- M = M0.getSubMatrix( 0, i, 0, 9 );
-
- final RealMatrix M2 = M.transpose().multiply( M );
-
- final RealVector O = new ArrayRealVector( nPoints );
- O.mapAddToSelf( 1 );
-
- final RealVector MO = M.transpose().operate( O );
-
- final DecompositionSolver solver = new SingularValueDecomposition( M2 ).getSolver();
- final RealMatrix I = solver.getInverse();
-
- final RealVector V = I.operate( MO );
- return V;
- }
-
- /**
- * Reshape the fit result vector in the shape of an algebraic matrix.
- *
- *
- * A = [ Ax2 2Dxy 2Exz 2Gx ] - * [ 2Dxy By2 2Fyz 2Hy ] - * [ 2Exz 2Fyz Cz2 2Iz ] - * [ 2Gx 2Hy 2Iz -1 ] ] - *- * - * @param V the fit result. - * @return a new 4x4 real matrix. - */ - private static final RealMatrix toAlgebraicForm( final RealVector V ) - { - final RealMatrix A = new Array2DRowRealMatrix( 4, 4 ); - - A.setEntry( 0, 0, V.getEntry( 0 ) ); - A.setEntry( 0, 1, V.getEntry( 3 ) ); - A.setEntry( 0, 2, V.getEntry( 4 ) ); - A.setEntry( 0, 3, V.getEntry( 6 ) ); - A.setEntry( 1, 0, V.getEntry( 3 ) ); - A.setEntry( 1, 1, V.getEntry( 1 ) ); - A.setEntry( 1, 2, V.getEntry( 5 ) ); - A.setEntry( 1, 3, V.getEntry( 7 ) ); - A.setEntry( 2, 0, V.getEntry( 4 ) ); - A.setEntry( 2, 1, V.getEntry( 5 ) ); - A.setEntry( 2, 2, V.getEntry( 2 ) ); - A.setEntry( 2, 3, V.getEntry( 8 ) ); - A.setEntry( 3, 0, V.getEntry( 6 ) ); - A.setEntry( 3, 1, V.getEntry( 7 ) ); - A.setEntry( 3, 2, V.getEntry( 8 ) ); - A.setEntry( 3, 3, -1 ); - return A; - } -} diff --git a/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java b/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java index 0c88e45ed..3f384f969 100644 --- a/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java +++ b/src/main/java/fiji/plugin/trackmate/util/mesh/SpotMeshCursor.java @@ -2,9 +2,9 @@ import fiji.plugin.trackmate.SpotMesh; import gnu.trove.list.array.TDoubleArrayList; -import net.imagej.mesh.alg.zslicer.Slice; import net.imglib2.Cursor; import net.imglib2.RandomAccess; +import net.imglib2.mesh.alg.zslicer.Slice; /** * A {@link Cursor} that iterates over the pixels inside a mesh. @@ -196,7 +196,7 @@ public long getLongPosition( final int d ) public Cursor< T > copyCursor() { return new SpotMeshCursor<>( - ra.copyRandomAccess(), + ra.copy(), sm.copy(), cal.clone() ); } diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java index 61d6c848a..d3ff277bd 100644 --- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java +++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/BVVUtils.java @@ -13,11 +13,11 @@ import ij.process.LUT; import net.imagej.ImgPlus; import net.imagej.axis.Axes; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.nio.BufferMesh; -import net.imagej.mesh.obj.transform.TranslateMesh; import net.imglib2.img.display.imagej.ImgPlusViews; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.nio.BufferMesh; +import net.imglib2.mesh.obj.transform.TranslateMesh; import net.imglib2.type.Type; import net.imglib2.type.numeric.ARGBType; diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java index a825b3705..d77d407d1 100644 --- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java +++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/Icosahedron.java @@ -1,12 +1,12 @@ package fiji.plugin.trackmate.visualization.bvv; import fiji.plugin.trackmate.Spot; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.Triangle; -import net.imagej.mesh.naive.NaiveDoubleMesh; -import net.imagej.mesh.nio.BufferMesh; import net.imglib2.RealLocalizable; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.Triangle; +import net.imglib2.mesh.obj.naive.NaiveDoubleMesh; +import net.imglib2.mesh.obj.nio.BufferMesh; /** * Icosahedron spheres. diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java index 89a85bd65..46da5742e 100644 --- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java +++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/StupidMesh.java @@ -49,7 +49,7 @@ import bvv.core.shadergen.generate.Segment; import bvv.core.shadergen.generate.SegmentTemplate; import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; -import net.imagej.mesh.nio.BufferMesh; +import net.imglib2.mesh.obj.nio.BufferMesh; public class StupidMesh { @@ -116,13 +116,13 @@ private void init( final GL3 gl ) gl.glBindVertexArray( 0 ); } - public void setColor( final Color color, float alpha ) + public void setColor( final Color color, final float alpha ) { color.getComponents( carr ); carr[ 3 ] = alpha; } - public void setSelectionColor( final Color selectionColor, float alpha ) + public void setSelectionColor( final Color selectionColor, final float alpha ) { selectionColor.getComponents( scarr ); scarr[ 3 ] = alpha; diff --git a/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java b/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java index 82020e27f..a7c024b5b 100644 --- a/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java +++ b/src/main/java/fiji/plugin/trackmate/visualization/bvv/TrackMateBVV.java @@ -1,15 +1,10 @@ package fiji.plugin.trackmate.visualization.bvv; -import static fiji.plugin.trackmate.gui.Icons.TRACKMATE_ICON; - import java.awt.Color; -import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; -import javax.swing.JFrame; - import org.joml.Matrix4f; import bdv.viewer.animate.TranslationAnimator; @@ -19,20 +14,11 @@ import fiji.plugin.trackmate.Model; import fiji.plugin.trackmate.ModelChangeEvent; import fiji.plugin.trackmate.SelectionModel; -import fiji.plugin.trackmate.Settings; import fiji.plugin.trackmate.Spot; -import fiji.plugin.trackmate.TrackMate; import fiji.plugin.trackmate.features.FeatureUtils; -import fiji.plugin.trackmate.gui.GuiUtils; import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; -import fiji.plugin.trackmate.gui.wizard.TrackMateWizardSequence; -import fiji.plugin.trackmate.gui.wizard.WizardSequence; -import fiji.plugin.trackmate.io.TmXmlReader; import fiji.plugin.trackmate.visualization.AbstractTrackMateModelView; import fiji.plugin.trackmate.visualization.FeatureColorGenerator; -import fiji.plugin.trackmate.visualization.TrackMateModelView; -import fiji.plugin.trackmate.visualization.hyperstack.HyperStackDisplayer; -import ij.ImageJ; import ij.ImagePlus; import net.imglib2.RealLocalizable; import net.imglib2.realtransform.AffineTransform3D; @@ -81,8 +67,8 @@ public void render() if ( displaySettings.isSpotVisible() ) { final Matrix4f pvm = new Matrix4f( data.getPv() ); - Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() ); - Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view ); + final Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() ); + final Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view ); final int t = data.getTimepoint(); final Iterable< Spot > it = model.getSpots().iterable( t, true ); @@ -194,55 +180,10 @@ private void updateColor() continue; final Color color = spotColorGenerator.color( entry.getKey() ); - float alpha = ( float ) displaySettings.getSpotTransparencyAlpha(); + final float alpha = ( float ) displaySettings.getSpotTransparencyAlpha(); sm.setColor( color, alpha ); sm.setSelectionColor( displaySettings.getHighlightColor(), alpha ); } refresh(); } - - public static < T extends Type< T > > void main( final String[] args ) - { - try - { -// final String filePath = "samples/mesh/CElegansMask3D.tif"; - final String filePath = "samples/CElegans3D-smoothed-mask-orig.xml"; -// final String filePath = "../TrackMate-StarDist/samples/CTC-Fluo-N3DH-SIM-multiC.xml"; - - ImageJ.main( args ); - final TmXmlReader reader = new TmXmlReader( new File( filePath ) ); - if ( !reader.isReadingOk() ) - { - System.err.println( reader.getErrorMessage() ); - return; - } - final ImagePlus imp = reader.readImage(); - final Settings settings = reader.readSettings( imp ); - imp.show(); - - final Model model = reader.getModel(); - final SelectionModel selectionModel = new SelectionModel( model ); - final DisplaySettings ds = reader.getDisplaySettings(); - final TrackMate trackmate = new TrackMate( model, settings ); - - // Main view - final TrackMateModelView displayer = new HyperStackDisplayer( model, selectionModel, imp, ds ); - displayer.render(); - - // Wizard. - final WizardSequence sequence = new TrackMateWizardSequence( trackmate, selectionModel, ds ); - sequence.setCurrent( "ConfigureViews" ); - final JFrame frame = sequence.run( "TrackMate on " + imp.getShortTitle() ); - frame.setIconImage( TRACKMATE_ICON.getImage() ); - GuiUtils.positionWindow( frame, settings.imp.getWindow() ); - frame.setVisible( true ); - - final TrackMateBVV< T > tbvv = new TrackMateBVV<>( model, selectionModel, imp, ds ); - tbvv.render(); - } - catch ( final Exception e ) - { - e.printStackTrace(); - } - } } diff --git a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java index dfc83d4ed..fded6eef5 100644 --- a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java +++ b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/ModelEditActions.java @@ -17,7 +17,7 @@ import fiji.plugin.trackmate.Model; import fiji.plugin.trackmate.SelectionModel; import fiji.plugin.trackmate.Spot; -import fiji.plugin.trackmate.SpotShape; +import fiji.plugin.trackmate.SpotBase; import fiji.plugin.trackmate.detection.semiauto.SemiAutoTracker; import fiji.plugin.trackmate.util.ModelTools; import fiji.plugin.trackmate.util.TMUtils; @@ -76,7 +76,7 @@ private Spot makeSpot( Point mouseLocation ) SwingUtilities.convertPointFromScreen( mouseLocation, canvas ); } final double[] calibration = TMUtils.getSpatialCalibration( imp ); - return new Spot( + return new SpotBase( ( -0.5 + canvas.offScreenXD( mouseLocation.x ) ) * calibration[ 0 ], ( -0.5 + canvas.offScreenYD( mouseLocation.y ) ) * calibration[ 1 ], ( imp.getSlice() - 1 ) * calibration[ 2 ], @@ -265,24 +265,14 @@ public void changeSpotRadius( final boolean increase, final boolean fast ) ? radius + factor * dx * COARSE_STEP : radius + factor * dx * FINE_STEP; - if ( newRadius <= dx ) return; // Store new value of radius for next spot creation. previousRadius = newRadius; - final SpotShape shape = target.getShape(); - if ( null == shape ) - { - target.putFeature( Spot.RADIUS, newRadius ); - } - else - { - final double alpha = newRadius / radius; - shape.scale( alpha ); - target.putFeature( Spot.RADIUS, shape.radius() ); - } + // Actually scale the spot. + target.scale( radius / newRadius ); model.beginUpdate(); try diff --git a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java index af1cc0e7d..158260da4 100644 --- a/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java +++ b/src/main/java/fiji/plugin/trackmate/visualization/hyperstack/PaintSpotMesh.java @@ -11,9 +11,9 @@ import fiji.plugin.trackmate.SpotMesh; import fiji.plugin.trackmate.gui.displaysettings.DisplaySettings; import ij.ImagePlus; -import net.imagej.mesh.alg.zslicer.Contour; -import net.imagej.mesh.alg.zslicer.Slice; import net.imglib2.RealLocalizable; +import net.imglib2.mesh.alg.zslicer.Contour; +import net.imglib2.mesh.alg.zslicer.Slice; /** * Utility class to paint the {@link SpotMesh} component of spots. diff --git a/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java b/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java index 94456b577..9d28c8e35 100644 --- a/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java +++ b/src/test/java/fiji/plugin/trackmate/mesh/DebugZSlicer.java @@ -13,9 +13,9 @@ import ij.CompositeImage; import ij.ImageJ; import ij.ImagePlus; -import net.imagej.mesh.alg.zslicer.Contour; -import net.imagej.mesh.alg.zslicer.Slice; -import net.imagej.mesh.alg.zslicer.ZSlicer; +import net.imglib2.mesh.alg.zslicer.Contour; +import net.imglib2.mesh.alg.zslicer.Slice; +import net.imglib2.mesh.alg.zslicer.ZSlicer; public class DebugZSlicer { diff --git a/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java b/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java index 8ce097ad2..37e6f9961 100644 --- a/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java +++ b/src/test/java/fiji/plugin/trackmate/mesh/DefaultMesh.java @@ -16,8 +16,8 @@ import ij.measure.Calibration; import net.imagej.ImgPlus; import net.imagej.axis.Axes; -import net.imagej.mesh.Mesh; import net.imglib2.img.display.imagej.ImageJFunctions; +import net.imglib2.mesh.obj.Mesh; import net.imglib2.type.logic.BitType; public class DefaultMesh diff --git a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java index 84b9912f9..766d92e4b 100644 --- a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java +++ b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMesh.java @@ -14,21 +14,20 @@ import ij.gui.PolygonRoi; import net.imagej.ImgPlus; import net.imagej.axis.Axes; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.Vertices; -import net.imagej.mesh.alg.zslicer.Contour; -import net.imagej.mesh.alg.zslicer.Slice; -import net.imagej.mesh.alg.zslicer.ZSlicer; -import net.imagej.mesh.io.ply.PLYMeshIO; -import net.imagej.mesh.io.stl.STLMeshIO; -import net.imagej.mesh.naive.NaiveDoubleMesh; -import net.imagej.mesh.naive.NaiveDoubleMesh.Triangles; import net.imglib2.RandomAccessibleInterval; import net.imglib2.converter.RealTypeConverters; import net.imglib2.img.ImgView; import net.imglib2.img.display.imagej.ImageJFunctions; import net.imglib2.img.display.imagej.ImgPlusViews; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.alg.zslicer.Contour; +import net.imglib2.mesh.alg.zslicer.Slice; +import net.imglib2.mesh.alg.zslicer.ZSlicer; +import net.imglib2.mesh.io.ply.PLYMeshIO; +import net.imglib2.mesh.io.stl.STLMeshIO; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.Vertices; +import net.imglib2.mesh.obj.naive.NaiveDoubleMesh; import net.imglib2.roi.labeling.ImgLabeling; import net.imglib2.roi.labeling.LabelRegion; import net.imglib2.roi.labeling.LabelRegions; @@ -112,8 +111,8 @@ public static void main( final String[] args ) static Mesh debugMesh( final long[] min, final long[] max ) { final NaiveDoubleMesh mesh = new NaiveDoubleMesh(); - final net.imagej.mesh.naive.NaiveDoubleMesh.Vertices vertices = mesh.vertices(); - final Triangles triangles = mesh.triangles(); + final net.imglib2.mesh.obj.naive.NaiveDoubleMesh.Vertices vertices = mesh.vertices(); + final net.imglib2.mesh.obj.naive.NaiveDoubleMesh.Triangles triangles = mesh.triangles(); // Coords as X Y Z @@ -198,11 +197,10 @@ private static void testIO( final Mesh mesh, final int j ) // Serialize to disk. try { - new STLMeshIO().save( mesh, String.format( "samples/mesh/io/STL_%02d.stl", j ) ); + STLMeshIO.save( mesh, String.format( "samples/mesh/io/STL_%02d.stl", j ) ); - final PLYMeshIO plyio = new PLYMeshIO(); - plyio.save( mesh, String.format( "samples/mesh/io/PLY_%02d.ply", j ) ); - final byte[] bs = plyio.writeAscii( mesh ); + PLYMeshIO.save( mesh, String.format( "samples/mesh/io/PLY_%02d.ply", j ) ); + final byte[] bs = PLYMeshIO.writeAscii( mesh ); final String str = new String( bs ); try (final FileWriter writer = new FileWriter( String.format( "samples/mesh/io/PLYTEXT_%02d.txt", j ) )) diff --git a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java index 39e1add05..52a32b51c 100644 --- a/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java +++ b/src/test/java/fiji/plugin/trackmate/mesh/Demo3DMeshTrackMate.java @@ -14,8 +14,8 @@ public static void main( final String[] args ) { ImageJ.main( args ); - final String filePath = "samples/CElegans3D-smoothed-mask-orig.tif"; -// final String filePath = "samples/Celegans-5pc-17timepoints.tif"; +// final String filePath = "samples/CElegans3D-smoothed-mask-orig-t7.tif"; + final String filePath = "samples/Celegans-5pc-17timepoints.tif"; final ImagePlus imp = IJ.openImage( filePath ); imp.show(); diff --git a/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java b/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java index 44b560382..890b4a553 100644 --- a/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java +++ b/src/test/java/fiji/plugin/trackmate/mesh/ExportMeshForDemo.java @@ -12,7 +12,7 @@ import fiji.plugin.trackmate.detection.ThresholdDetectorFactory; import ij.IJ; import ij.ImagePlus; -import net.imagej.mesh.io.stl.STLMeshIO; +import net.imglib2.mesh.io.stl.STLMeshIO; public class ExportMeshForDemo { @@ -42,7 +42,6 @@ public static void main( final String[] args ) if ( !file.isDirectory() ) file.delete(); - final STLMeshIO io = new STLMeshIO(); for ( final Spot spot : spots.iterable( true ) ) { final int t = spot.getFeature( Spot.FRAME ).intValue(); @@ -51,7 +50,7 @@ public static void main( final String[] args ) if ( spot instanceof SpotMesh ) { final SpotMesh mesh = ( SpotMesh ) spot; - io.save( mesh.getMesh(), savePath ); + STLMeshIO.save( mesh.getMesh(), savePath ); } } System.out.println( "Export done." ); diff --git a/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java b/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java index 7e3f4e7dc..0c2cb85e7 100644 --- a/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java +++ b/src/test/java/fiji/plugin/trackmate/mesh/MeshPlayground.java @@ -21,12 +21,11 @@ import ij.ImagePlus; import net.imagej.ImgPlus; import net.imagej.axis.Axes; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.Meshes; -import net.imagej.mesh.io.stl.STLMeshIO; -import net.imagej.mesh.naive.NaiveDoubleMesh; -import net.imagej.mesh.nio.BufferMesh; import net.imglib2.img.display.imagej.ImgPlusViews; +import net.imglib2.mesh.Meshes; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.naive.NaiveDoubleMesh; +import net.imglib2.mesh.obj.nio.BufferMesh; import net.imglib2.type.Type; import net.imglib2.type.numeric.ARGBType; @@ -55,7 +54,7 @@ public static < T extends Type< T > > void main( final String[] args ) final List< StupidMesh > meshes = new ArrayList<>(); - for ( int j = 1; j <= 3; ++j) + for ( int j = 1; j <= 3; ++j ) { final String fn = String.format( "samples/mesh/CElegansMask3D_%02d.stl", j ); meshes.add( new StupidMesh( load( fn ) ) ); @@ -68,8 +67,8 @@ public static < T extends Type< T > > void main( final String[] args ) if ( showMeshes.get() ) { final Matrix4f pvm = new Matrix4f( data.getPv() ); - Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() ); - Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view ); + final Matrix4f view = MatrixMath.affine( data.getRenderTransformWorldToScreen(), new Matrix4f() ); + final Matrix4f vm = MatrixMath.screen( data.getDCam(), data.getScreenWidth(), data.getScreenHeight(), new Matrix4f() ).mul( view ); meshes.forEach( mesh -> mesh.draw( gl, pvm, vm, false ) ); } } ); @@ -91,8 +90,7 @@ private static BufferMesh load( final String fn ) try { final NaiveDoubleMesh nmesh = new NaiveDoubleMesh(); - final STLMeshIO meshIO = new STLMeshIO(); - meshIO.read( nmesh, new File( fn ) ); + net.imglib2.mesh.io.stl.STLMeshIO.read( nmesh, new File( fn ) ); mesh = calculateNormals( nmesh // Meshes.removeDuplicateVertices( nmesh, 5 ) diff --git a/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java b/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java index c5fabdd62..f5172a51c 100644 --- a/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java +++ b/src/test/java/fiji/plugin/trackmate/mesh/TestEllipsoidFit.java @@ -5,10 +5,10 @@ import org.junit.Test; -import fiji.plugin.trackmate.util.mesh.EllipsoidFitter; -import fiji.plugin.trackmate.util.mesh.EllipsoidFitter.EllipsoidFit; -import net.imagej.mesh.Mesh; -import net.imagej.mesh.naive.NaiveDoubleMesh; +import net.imglib2.mesh.alg.EllipsoidFitter; +import net.imglib2.mesh.alg.EllipsoidFitter.EllipsoidFit; +import net.imglib2.mesh.obj.Mesh; +import net.imglib2.mesh.obj.naive.NaiveDoubleMesh; public class TestEllipsoidFit {