/* * Copyright (c) 2016 Vivid Solutions. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Eclipse Distribution License v. 1.0 which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package test.jts.geom; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.LinearRing; import org.locationtech.jts.geom.Polygon; /** * @version 1.7 */ public class GeometryTestFactory { public static Coordinate[] createBox( double minx, double miny, int nSide, double segLen) { int i; int ipt = 0; Coordinate[] pts = new Coordinate[4 * nSide + 1]; double maxx = minx + nSide * segLen; double maxy = miny + nSide * segLen; for (i = 0; i < nSide; i++) { double x = minx + i * segLen; double y = miny; pts[ipt++] = new Coordinate(x, y); } for (i = 0; i < nSide; i++) { double x = maxx; double y = miny + i * segLen; pts[ipt++] = new Coordinate(x, y); } for (i = 0; i < nSide; i++) { double x = maxx - i * segLen; double y = maxy; pts[ipt++] = new Coordinate(x, y); } for (i = 0; i < nSide; i++) { double x = minx; double y = maxy - i * segLen; pts[ipt++] = new Coordinate(x, y); } pts[ipt++] = new Coordinate(pts[0]); return pts; } public static Polygon createCircle( GeometryFactory fact, double basex, double basey, double size, int nPts) { Coordinate[] pts = createCircle(basex, basey, size, nPts); LinearRing ring = fact.createLinearRing(pts); Polygon poly = fact.createPolygon(ring, null); return poly; } /** * Creates a circle * @param basex the centre x coord * @param basey the centre y coord * @param size the size of the envelope of the star * @param nPts the number of points in the star */ public static Coordinate[] createCircle( double basex, double basey, double size, int nPts) { Coordinate[] pts = new Coordinate[nPts + 1]; int iPt = 0; double len = size / 2.0; for (int i = 0; i < nPts; i++) { double ang = i * (2 * Math.PI / nPts); double x = len * Math.cos(ang) + basex; double y = len * Math.sin(ang) + basey; Coordinate pt = new Coordinate(x, y); pts[iPt++] = pt; } pts[iPt] = pts[0]; return pts; } public static Polygon createBox( GeometryFactory fact, double minx, double miny, int nSide, double segLen) { Coordinate[] pts = createBox(minx, minx, nSide, segLen); LinearRing ring = fact.createLinearRing(pts); Polygon poly = fact.createPolygon(ring, null); return poly; } /** * Creates a star from a "circular" sine wave * @param basex the centre x coord * @param basey the centre y coord * @param size the size of the envelope of the star * @param armLen the length of an arm of the star * @param nArms the number of arms of the star * @param nPts the number of points in the star */ public static Coordinate[] createSineStar( double basex, double basey, double size, double armLen, int nArms, int nPts) { double armBaseLen = size / 2 - armLen; if (armBaseLen < 0) armBaseLen = 0.5; double angInc = 2 * Math.PI / nArms; int nArmPt = nPts / nArms; if (nArmPt < 5) nArmPt = 5; int nPts2 = nArmPt * nArms; Coordinate[] pts = new Coordinate[nPts2 + 1]; int iPt = 0; double starAng = 0.0; for (int iArm = 0; iArm < nArms; iArm++) { for (int iArmPt = 0; iArmPt < nArmPt; iArmPt++) { double ang = iArmPt * (2 * Math.PI / nArmPt); double len = armLen * (1 - Math.cos(ang) / 2) + armBaseLen; double x = len * Math.cos(starAng + iArmPt * angInc / nArmPt) + basex; double y = len * Math.sin(starAng + iArmPt * angInc / nArmPt) + basey; Coordinate pt = new Coordinate(x, y); pts[iPt++] = pt; } starAng += angInc; } pts[iPt] = pts[0]; return pts; } public static Polygon createSineStar( GeometryFactory fact, double basex, double basey, double size, double armLen, int nArms, int nPts) { Coordinate[] pts = createSineStar(basex, basey, size, armLen, nArms, nPts); LinearRing ring = fact.createLinearRing(pts); Polygon poly = fact.createPolygon(ring, null); return poly; } }