1
+ var React = require ( 'react' ) ;
2
+ var Art = require ( 'react-art' ) ;
3
+ var _ = require ( 'underscore' ) ;
4
+ var HexTile = require ( './hex-tile.jsx' ) ;
5
+ var Group = Art . Group ;
6
+
7
+ var SIZE_TO_PACKED_WIDTH = 1.7320508075688772 ;
8
+ var SIZE_TO_PACKED_HEIGHT = 1.5 ;
9
+
10
+ function getOptimalSize ( widthPixels , heightPixels , countHorizontal , countVertical ) {
11
+ // add extra amounts for offset rows and bottom points of hexes on last row
12
+ var packedhexWidth = widthPixels / ( parseInt ( countHorizontal , 10 ) + 0.5 ) ;
13
+ var adjustedGridHeight = ( heightPixels * SIZE_TO_PACKED_HEIGHT ) / ( parseInt ( countVertical , 10 ) + 0.5 ) ;
14
+ var packedHexHeight = adjustedGridHeight / SIZE_TO_PACKED_HEIGHT ;
15
+
16
+ var size = null ;
17
+
18
+ if ( ( packedhexWidth / SIZE_TO_PACKED_WIDTH ) < ( packedHexHeight / SIZE_TO_PACKED_HEIGHT ) ) {
19
+ size = packedhexWidth / SIZE_TO_PACKED_WIDTH ;
20
+ }
21
+ else {
22
+ size = packedHexHeight / SIZE_TO_PACKED_HEIGHT ;
23
+ }
24
+
25
+ return size . toFixed ( 8 ) ;
26
+ }
27
+
28
+ function calculatePixelCoordinates ( baseVector , hexSize , axialXCoord , axialYCoord ) {
29
+ return {
30
+ x : baseVector . x + ( hexSize * Math . sqrt ( 3 ) * ( axialXCoord + axialYCoord / 2 ) ) ,
31
+ y : baseVector . y + ( hexSize * 3 / 2 * axialYCoord )
32
+ } ;
33
+ }
34
+
35
+ function setupHexPositionsRadial ( widthPixels , heightPixels , countHorizontal , countVertical ) {
36
+ var size = getOptimalSize (
37
+ widthPixels ,
38
+ heightPixels ,
39
+ countHorizontal ,
40
+ countVertical
41
+ ) ;
42
+
43
+ var centreX = Math . floor ( widthPixels / 2 ) ;
44
+ var centreY = Math . floor ( heightPixels / 2 ) ;
45
+ var gridRadiusVertical = ( countVertical - 1 ) / 2 ;
46
+ var centreVector = {
47
+ x : Math . floor ( widthPixels / 2 ) ,
48
+ y : Math . floor ( heightPixels / 2 )
49
+ } ;
50
+ var hexSize = parseFloat ( size , 10 ) ;
51
+ var widthOffset = ( countHorizontal - countVertical ) / 2 ;
52
+
53
+ var rows = [ ] ;
54
+ _ . times ( countVertical , function ( indexVertical ) {
55
+ var axialYCoord = indexVertical - gridRadiusVertical ;
56
+ var distanceFromCentreVertical = Math . abs ( axialYCoord ) ;
57
+ var adjustedCountHorizontal = countHorizontal - distanceFromCentreVertical ;
58
+
59
+ var row = [ ] ;
60
+
61
+ _ . times ( adjustedCountHorizontal , function ( indexHorizontal ) {
62
+ var axialXCoord = indexHorizontal - Math . min ( indexVertical , gridRadiusVertical ) - widthOffset ;
63
+ var cubeXCoord = 0 ;
64
+ var cubeYCoord = 0 ;
65
+
66
+ row . push ( {
67
+ axialCoordinates : {
68
+ x : axialXCoord ,
69
+ y : axialYCoord
70
+ } ,
71
+ cubeCoordinates : {
72
+ x : axialXCoord ,
73
+ y : ( - axialXCoord ) - axialYCoord ,
74
+ z : axialYCoord
75
+ } ,
76
+ size : hexSize - 0.4 ,
77
+ pixelCoordinates : calculatePixelCoordinates ( centreVector , hexSize , axialXCoord , axialYCoord )
78
+ } ) ;
79
+ } ) ;
80
+
81
+ rows . push ( row ) ;
82
+ } ) ;
83
+
84
+ return rows ;
85
+ }
86
+
87
+ module . exports = React . createClass ( {
88
+ render : function ( ) {
89
+ var widthPixels = this . props . width ;
90
+ var heightPixels = this . props . height ;
91
+ var hexCountHorizontal = this . props . hexCountHorizontal ;
92
+ var hexCountVertical = this . props . hexCountVertical ;
93
+
94
+ var hexPositions = setupHexPositionsRadial (
95
+ widthPixels ,
96
+ heightPixels ,
97
+ hexCountHorizontal ,
98
+ hexCountVertical
99
+ ) ;
100
+
101
+ var hexGrid = _ . map ( hexPositions , function ( hexRow ) {
102
+ var rowElements = _ . map ( hexRow , function ( hexData ) {
103
+ return (
104
+ < HexTile size = { hexData . size } centre = { hexData . pixelCoordinates } > </ HexTile >
105
+ ) ;
106
+ } ) ;
107
+
108
+ return (
109
+ < Group >
110
+ { rowElements }
111
+ </ Group >
112
+ ) ;
113
+ } ) ;
114
+
115
+ return (
116
+ < Group >
117
+ { hexGrid }
118
+ </ Group >
119
+ ) ;
120
+ }
121
+ } ) ;
0 commit comments