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 int hashCode() { return Polygon2D.hashCode( this ); }
@Override public void compute(Polygon2D input, DoubleType output) { output.set(input.numVertices()); }
/** * Computes a hash code for a polygon. The hash code value is based on the * vertex positions and boundary type. * * @param polygon * The polygon for which to compute the hash code. * @return Hash code of the polygon. */ static int hashCode( final Polygon2D polygon ) { int result = 203; int t = 5; for (final RealLocalizable v : polygon.vertices()) { final double x = v.getDoublePosition( 0 ); final double y = v.getDoublePosition( 1 ); result += ( x * x ) + ( y * t ); t += 7; } if ( polygon.boundaryType() == BoundaryType.CLOSED ) result += 21; else if ( polygon.boundaryType() == BoundaryType.OPEN ) result += 61; else result += 3; return result; } }
@Override public void compute(Polygon2D input, DoubleType output) { output.set(convexHullFunc.calculate(input).numVertices()); }
private double getY(final Polygon2D input, final int index) { int i = index; if (i == input.numVertices()) i = 0; return input.vertex(i).getDoublePosition(1); }
@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); } }
@Override public int hashCode() { return Polygon2D.hashCode(this); }
private double getX(final Polygon2D input, final int index) { int i = index; if (i == input.numVertices()) i = 0; return input.vertex(i).getDoublePosition(0); }
@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); } }
@Override public int hashCode() { return Polygon2D.hashCode(this); }
@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) { 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); }
@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)); }
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) - ch.vertex(i - 1).getDoublePosition(0)); final double angle = Math.atan2(ch.vertex(0).getDoublePosition(1) - ch .vertex(ch.numVertices() - 1).getDoublePosition(1), ch.vertex(0) .getDoublePosition(0) - ch.vertex(ch.numVertices() - 1) .getDoublePosition(0));