1 /*** 2 * Redistribution and use in source and binary forms, with or without 3 * modification, are permitted provided that the following conditions are 4 * met : 5 * 6 * . Redistributions of source code must retain the above copyright 7 * notice, this list of conditions and the following disclaimer. 8 * 9 * . Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * . The name of the author may not be used to endorse or promote products 14 * derived from this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 24 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 25 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 * 28 * $Id: FlatHexagonBuilder.java,v 1.1 2005/09/09 18:24:28 mat007 Exp $ 29 */ 30 31 package jtge.util.grid.builder; 32 33 import java.awt.Point; 34 import java.awt.Polygon; 35 import jtge.util.grid.Coordinate; 36 import jtge.util.grid.GridUtil; 37 38 /*** 39 * Utiliy class used to help drawing flat hexagons. 40 * 41 * @author Jean-Laurent 42 * @version $Id: FlatHexagonBuilder.java,v 1.1 2005/09/09 18:24:28 mat007 Exp $ 43 */ 44 public class FlatHexagonBuilder extends AbstractHexagonBuilder 45 { 46 /*** 47 * Create a flat hexagon builder. 48 * 49 * @param hexagonSideLength the length of an hexagon side in pixels 50 * @param shifted whether to shift the top left hexagon or not 51 */ 52 public FlatHexagonBuilder( final int hexagonSideLength, final boolean shifted ) 53 { 54 super( hexagonSideLength, shifted ); 55 } 56 57 /*** 58 * {@inheritDoc} 59 */ 60 public final int computeWidth( final int width ) 61 { 62 return floor( ((S + H) * width) + H ); 63 } 64 65 /*** 66 * {@inheritDoc} 67 */ 68 public final int computeHeight( final int height ) 69 { 70 return floor( (A * height) + R ); 71 } 72 73 /*** 74 * {@inheritDoc} 75 */ 76 public final Polygon buildHexagon( final Coordinate coordinate ) 77 { 78 final double[] x = new double[6]; 79 final double[] y = new double[6]; 80 x[0] = coordinate.getX() * (B - H); 81 y[0] = coordinate.getY() * A + R + shift( coordinate.getX() ); 82 x[1] = x[0] + H; 83 y[1] = y[0] - R; 84 x[2] = x[1] + S; 85 y[2] = y[1]; 86 x[3] = x[2] + H; 87 y[3] = y[0]; 88 x[4] = x[2]; 89 y[4] = y[0] + R; 90 x[5] = x[1]; 91 y[5] = y[4]; 92 return new Polygon( floor( x ), floor( y ), 6 ); 93 } 94 95 private double shift( final int x ) 96 { 97 if( !shifted && GridUtil.odd( x ) ) 98 return R; 99 if( shifted && GridUtil.even( x ) ) 100 return R; 101 return 0; 102 } 103 104 /*** 105 * {@inheritDoc} 106 */ 107 protected final Coordinate approximate( final Point point ) 108 { 109 final int x = floor( point.x / (H + S) ); 110 final int y = floor( (point.y - shift( x )) / A ); 111 return new Coordinate( x, y ); 112 } 113 }