package ini.trakem2.display; import ini.trakem2.utils.M; import java.awt.geom.AffineTransform; import java.awt.geom.Area; import java.util.ArrayList; import java.util.List; final public class VectorDataTransform { final public Layer layer; final public List<ROITransform> transforms = new ArrayList<ROITransform>(); public VectorDataTransform(final Layer layer) { this.layer = layer; } public class ROITransform { public mpicbg.models.CoordinateTransform ct; public Area roi; /** A coordinate transform @param ct that applies to the @param roi Area only. */ public ROITransform(final Area roi, final mpicbg.models.CoordinateTransform ct) { this.roi = roi; this.ct = ct; } } /** Add a coordinate transform @param ct that applies to the @param roi Area only; * ASSUMES all rois added do not overlap. */ public void add(final Area roi, final mpicbg.models.CoordinateTransform ct) { transforms.add(new ROITransform(roi, ct)); } /** Returns a copy whose roi and ct are local to the affine transform of @param d. */ public VectorDataTransform makeLocalTo(final Displayable d) throws Exception { final VectorDataTransform local = new VectorDataTransform(this.layer); final AffineTransform inverse = d.at.createInverse(); for (final ROITransform rt : transforms) { local.add(rt.roi.createTransformedArea(inverse), M.wrap(d.at, rt.ct, inverse)); } return local; } }