package com.revolsys.geometry.test.function; import com.revolsys.geometry.model.Geometry; import com.revolsys.geometry.model.GeometryFactory; import com.revolsys.geometry.model.LineCap; import com.revolsys.geometry.model.LineString; import com.revolsys.geometry.model.Point; import com.revolsys.geometry.model.PointList; import com.revolsys.geometry.model.coordinates.list.CoordinatesListUtil; import com.revolsys.geometry.model.impl.PointDoubleXY; import com.revolsys.geometry.operation.buffer.BufferParameters; import com.revolsys.geometry.util.GeometricShapeFactory; public class JTSFunctions { private static final double HEIGHT = 70; private static final double WIDTH = 150; // 125; private static final double J_WIDTH = 30; private static final double J_RADIUS = J_WIDTH - 5; private static final double S_RADIUS = HEIGHT / 4; private static final double T_WIDTH = WIDTH - 2 * S_RADIUS - J_WIDTH; public static String jtsVersion(final Geometry g) { return ""; } public static Geometry logoBuffer(final Geometry g, final double distance) { final Geometry lines = logoLines(g); final BufferParameters bufParams = new BufferParameters(); bufParams.setEndCapStyle(LineCap.SQUARE); return lines.buffer(distance, bufParams); } public static Geometry logoLines(final Geometry g) { return newJ(g).union(newT(g)).union(newS(g)); } private static Geometry newJ(final Geometry g) { final GeometryFactory gf = FunctionsUtil.getFactoryOrDefault(g); final Point[] jTop = new Point[] { new PointDoubleXY(0, HEIGHT), new PointDoubleXY(J_WIDTH, HEIGHT), new PointDoubleXY(J_WIDTH, J_RADIUS) }; final Point[] jBottom = new Point[] { new PointDoubleXY(J_WIDTH - J_RADIUS, 0), new PointDoubleXY(0, 0) }; final GeometricShapeFactory gsf = new GeometricShapeFactory(gf); gsf.setBase(new PointDoubleXY(J_WIDTH - 2 * J_RADIUS, 0)); gsf.setSize(2 * J_RADIUS); gsf.setNumPoints(10); final LineString jArc = gsf.newArc(1.5 * Math.PI, 0.5 * Math.PI); final PointList coordList = new PointList(); coordList.add(jTop, false); coordList.add(CoordinatesListUtil.getPointArray(jArc.reverse()), false, 1, jArc.getVertexCount() - 1); coordList.add(jBottom, false); return gf.lineString(coordList.toPointArray()); } private static Geometry newS(final Geometry g) { final GeometryFactory gf = FunctionsUtil.getFactoryOrDefault(g); final double centreX = WIDTH - S_RADIUS; final Point[] top = new Point[] { new PointDoubleXY(WIDTH, HEIGHT), new PointDoubleXY(centreX, HEIGHT) }; final Point[] bottom = new Point[] { new PointDoubleXY(centreX, 0), new PointDoubleXY(WIDTH - 2 * S_RADIUS, 0) }; final GeometricShapeFactory gsf = new GeometricShapeFactory(gf); gsf.setCentre(new PointDoubleXY(centreX, HEIGHT - S_RADIUS)); gsf.setSize(2 * S_RADIUS); gsf.setNumPoints(10); final LineString arcTop = gsf.newArc(0.5 * Math.PI, Math.PI); final GeometricShapeFactory gsf2 = new GeometricShapeFactory(gf); gsf2.setCentre(new PointDoubleXY(centreX, S_RADIUS)); gsf2.setSize(2 * S_RADIUS); gsf2.setNumPoints(10); final LineString arcBottom = gsf2.newArc(1.5 * Math.PI, Math.PI).reverse(); final PointList coordList = new PointList(); coordList.add(top, false); coordList.add(CoordinatesListUtil.getPointArray(arcTop), false, 1, arcTop.getVertexCount() - 1); coordList.add(new PointDoubleXY(centreX, HEIGHT / 2)); coordList.add(CoordinatesListUtil.getPointArray(arcBottom), false, 1, arcBottom.getVertexCount() - 1); coordList.add(bottom, false); return gf.lineString(coordList.toPointArray()); } private static Geometry newT(final Geometry g) { final GeometryFactory gf = FunctionsUtil.getFactoryOrDefault(g); final Point[] tTop = new Point[] { new PointDoubleXY(J_WIDTH, HEIGHT), new PointDoubleXY(WIDTH - S_RADIUS - 5, HEIGHT) }; final Point[] tBottom = new Point[] { new PointDoubleXY(J_WIDTH + 0.5 * T_WIDTH, HEIGHT), new PointDoubleXY(J_WIDTH + 0.5 * T_WIDTH, 0) }; return gf.lineal(new LineString[] { gf.lineString(tTop), gf.lineString(tBottom) }); } }