package com.revolsys.geometry.model.vertex; import java.awt.geom.PathIterator; import java.util.Iterator; import com.revolsys.geometry.model.BoundingBox; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryComponent; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.Point; import com.revolsys.math.Angle; import com.revolsys.util.Property; public interface Vertex extends Point, Iterator<Vertex>, Iterable<Vertex>, GeometryComponent { @Override Vertex clone(); default int getAwtType() { if (isFrom()) { return PathIterator.SEG_MOVETO; } else { return PathIterator.SEG_LINETO; } } @Override default int getAxisCount() { final GeometryFactory geometryFactory = getGeometryFactory(); return (byte)geometryFactory.getAxisCount(); } @Override default BoundingBox getBoundingBox() { return newBoundingBox(); } @Override default double getCoordinate(final int axisIndex) { return 0; } <V extends Geometry> V getGeometry(); default double getLineCoordinateRelative(final int vertexOffset, final int axisIndex) { return Double.NaN; } default Vertex getLineNext() { return null; } default Vertex getLinePrevious() { return null; } default double getOrientaton() { if (isEmpty()) { return 0; } else { final double x = getX(); final double y = getY(); double angle; if (isTo()) { final double x1 = getLineCoordinateRelative(-1, 0); final double y1 = getLineCoordinateRelative(-1, 1); angle = Angle.angleDegrees(x1, y1, x, y); } else { final double x1 = getLineCoordinateRelative(1, 0); final double y1 = getLineCoordinateRelative(1, 1); angle = Angle.angleDegrees(x, y, x1, y1); } if (Double.isNaN(angle)) { return 0; } else { return angle; } } } default double getOrientaton(final GeometryFactory geometryFactory) { if (isEmpty()) { return 0; } else if (isSameCoordinateSystem(geometryFactory)) { return getOrientaton(); } else { final Point point1 = convertPoint2d(geometryFactory); final double x = point1.getX(); final double y = point1.getY(); double angle; if (isTo()) { final Point point2 = getLinePrevious().convertPoint2d(geometryFactory); if (Property.hasValue(point2)) { final double x1 = point2.getX(); final double y1 = point2.getY(); angle = Angle.angleDegrees(x1, y1, x, y); } else { return 0; } } else { final Point point2 = getLineNext().convertPoint2d(geometryFactory); if (Property.hasValue(point2)) { final double x1 = point2.getX(); final double y1 = point2.getY(); angle = Angle.angleDegrees(x, y, x1, y1); } else { return 0; } } if (Double.isNaN(angle)) { return 0; } else { return angle; } } } default int getPartIndex() { return -1; } default int getRingIndex() { return -1; } int[] getVertexId(); default int getVertexIndex() { final int[] vertexId = getVertexId(); return vertexId[vertexId.length - 1]; } @Override default boolean isEmpty() { return false; } default boolean isFrom() { return false; } default boolean isTo() { return false; } @Override default Iterator<Vertex> iterator() { return this; } }