DOWNLOAD
package Batch; import AngioTool.PolygonPlus;import ij.gui.PolygonRoi;import ij.gui.Roi;import ij.gui.ShapeRoi;import java.util.concurrent.ThreadPoolExecutor; public class ComputeShapeRoiSplines implements ISliceCompute { static final int IN_PLACE_THRESHOLD = 60; private int fraction; private ShapeRoi originalShapeRoi; private Roi[] originalRoi; private ShapeRoi src; private ShapeRoi finalShapeRoi; public ComputeShapeRoiSplines(ShapeRoi src, int fraction) { this.src = src; this.originalShapeRoi = src; this.originalRoi = src.getRois(); this.fraction = fraction; this.finalShapeRoi = null; } @Override public Object computeSlice(int sliceIdx, int start, int length) { ShapeRoi first = new ShapeRoi(new Roi(this.src.getBounds())); ShapeRoi result = new ShapeRoi(first); for(int i = start; i < start + length; ++i) { PolygonRoi pr = new PolygonRoi(this.originalRoi[i].getPolygon(), 2); int coordinates = pr.getNCoordinates(); double area = new PolygonPlus(pr.getPolygon()).area(); pr.fitSpline(pr.getNCoordinates() / this.fraction); result.xor(new ShapeRoi(pr)); } result.xor(first); return result; } @Override public void finishSlice(ISliceCompute.Result slice) { ShapeRoi s = (ShapeRoi)slice.result; if (finalShapeRoi == null) finalShapeRoi = s; else finalShapeRoi.xor(s); } public static ShapeRoi computeSplines(ThreadPoolExecutor threadPool, int maxWorkers, ShapeRoi sr, int fraction) { ComputeShapeRoiSplines splines = new ComputeShapeRoiSplines(sr, fraction); ParallelUtils.computeSlicesInParallel( threadPool, maxWorkers, ParallelUtils.makeBinaryTreeOfSlices(sr.getRois().length, IN_PLACE_THRESHOLD - 1), splines ); return splines.finalShapeRoi; }}