/* * 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 org.locationtech.jtstest.testbuilder.model; import java.awt.geom.Point2D; /** * @version 1.7 */ public class DrawingGrid { public static int DEFAULT_GRID_SIZE = 10; public static final int GRID_MAJOR_FACTOR = 1; private double gridSize = DEFAULT_GRID_SIZE; private int numGridUnits; public DrawingGrid(int gridSize) { setGridSize(gridSize); } public DrawingGrid() { this(DEFAULT_GRID_SIZE); } public Point2D snapToGrid(Point2D modelPoint) { return snapToGrid(modelPoint, 1); } public Point2D snapToMajorGrid(Point2D modelPoint) { return snapToGrid(modelPoint, GRID_MAJOR_FACTOR); } public Point2D snapToGrid(Point2D modelPoint, int factor) { double rx, ry; int numUnits = factor * numGridUnits; if (isFractional()) { rx = Math.floor(modelPoint.getX() * numUnits + .5) / numUnits; ry = Math.floor(modelPoint.getY() * numUnits + .5) / numUnits; } else { rx = Math.floor(modelPoint.getX()/numUnits + .5) * numUnits; ry = Math.floor(modelPoint.getY()/numUnits + .5) * numUnits; } return new Point2D.Double(rx, ry); } public void setGridSize(double gridSize) { this.gridSize = gridSize; numGridUnits = (int) Math.floor(gridSize); if (isFractional()) { numGridUnits = (int) Math.floor(1.0 / gridSize); } } public boolean isFractional() { return gridSize < 1.0; } public double getGridSize () { return gridSize; } public boolean isResolvable(Point2D p1, Point2D p2) { return p2.getX() - p1.getX() < getGridSize(); } }