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 }