public static List<RealLocalizable> vertices(final Polygon2D polygon) { final List<RealLocalizable> vertices = new ArrayList<>(polygon .numVertices()); for (int i = 0; i < polygon.numVertices(); i++) vertices.add(polygon.vertex(i)); return vertices; } }
@Override public PolygonRoi convert(final Polygon2D mask) { final float[] x = new float[mask.numVertices()]; final float[] y = new float[mask.numVertices()]; for (int i = 0; i < mask.numVertices(); i++) { final RealLocalizable v = mask.vertex(i); x[i] = (float) v.getDoublePosition(0); y[i] = (float) v.getDoublePosition(1); } return new PolygonRoi(x, y, mask.numVertices(), Roi.POLYGON); }
@Override public void compute(Polygon2D input, DoubleType output) { output.set(input.numVertices()); }
private double getX(final Polygon2D input, final int index) { int i = index; if (i == input.numVertices()) i = 0; return input.vertex(i).getDoublePosition(0); }
private double getY(final Polygon2D input, final int index) { int i = index; if (i == input.numVertices()) i = 0; return input.vertex(i).getDoublePosition(1); }
@Override public void compute(Polygon2D input, DoubleType output) { output.set(convexHullFunc.calculate(input).numVertices()); }
@Override public RealLocalizable calculate(final Polygon2D input) { double area = sizeFunc.calculate(input).get(); double cx = 0; double cy = 0; for (int i = 0; i < input.numVertices(); i++) { RealLocalizable p0 = input.vertex(i); RealLocalizable p1 = input.vertex((i + 1) % input.numVertices()); double p0_x = p0.getDoublePosition(0); double p0_y = p0.getDoublePosition(1); double p1_x = p1.getDoublePosition(0); double p1_y = p1.getDoublePosition(1); cx += (p0_x + p1_x) * (p0_x * p1_y - p1_x * p0_y); cy += (p0_y + p1_y) * (p0_x * p1_y - p1_x * p0_y); } return new RealPoint(cx / (area * 6), cy / (area * 6)); }
@Override public void compute(Polygon2D input, DoubleType output) { double sum = 0; final int numVertices = input.numVertices(); for (int i = 0; i < numVertices; i++) { final RealLocalizable p0 = input.vertex(i); final RealLocalizable p1 = input.vertex((i + 1) % numVertices); final double p0_x = p0.getDoublePosition(0); final double p0_y = p0.getDoublePosition(1); final double p1_x = p1.getDoublePosition(0); final double p1_y = p1.getDoublePosition(1); sum += p0_x * p1_y - p0_y * p1_x; } output.set(Math.abs(sum) / 2d); }
@Test public void contour() { // ground truth computed with matlab final Polygon2D test = (Polygon2D) ops.run(DefaultContour.class, ROI, true); final List<? extends RealLocalizable> expected = GeomUtils.vertices(contour); final List<? extends RealLocalizable> received = GeomUtils.vertices(test); assertEquals("Number of polygon points differs.", expected.size(), received.size()); for (int i = 0; i < contour.numVertices(); i++) { assertEquals("Polygon point " + i + " differs in x-coordinate.", expected.get(i).getDoublePosition(0), received.get(i).getDoublePosition(0), EPSILON); assertEquals("Polygon point " + i + " differs in y-coordinate.", expected.get(i).getDoublePosition(1), received.get(i).getDoublePosition(1), EPSILON); } }
@Test public void labelRegionToPolygonConverter() { // ground truth computed with matlab final LabelRegionToPolygonConverter c = new LabelRegionToPolygonConverter(); c.setContext(ops.context()); final Polygon2D test = c.convert(ROI, Polygon2D.class); final List<? extends RealLocalizable> expected = GeomUtils.vertices(contour); final List<? extends RealLocalizable> received = GeomUtils.vertices(test); assertEquals("Number of polygon points differs.", expected.size(), received.size()); for (int i = 0; i < contour.numVertices(); i++) { assertEquals("Polygon point " + i + " differs in x-coordinate.", expected.get(i).getDoublePosition(0), received.get(i).getDoublePosition(0), EPSILON); assertEquals("Polygon point " + i + " differs in y-coordinate.", expected.get(i).getDoublePosition(1), received.get(i).getDoublePosition(1), EPSILON); } }
double minArea = Double.POSITIVE_INFINITY; for (int i = 1; i < ch.numVertices() - 1; i++) { final double angle = Math.atan2(ch.vertex(i).getDoublePosition(1) - ch .vertex(i - 1).getDoublePosition(1), ch.vertex(i).getDoublePosition(0) - .vertex(ch.numVertices() - 1).getDoublePosition(1), ch.vertex(0) .getDoublePosition(0) - ch.vertex(ch.numVertices() - 1) .getDoublePosition(0));