View difference between Paste ID: 96ysdaem and QmAFCPHZ
SHOW: | | - or go back to the newest paste.
1
2
// Hexagonal coordinate.
3
// Stores as 3d coordinate system.
4
// Assuming our hexagon is x+y+z = 0; plane intersection of a cube & origin
5-
function displacement(dx,dy,dz){
5+
6
function displacement( dx, dy, dz ){
7
	return {
8
		dx:dx,
9
		dy:dy,
10
		dz:dz
11
	};
12
}
13
14
15
var neighbours = [
16
	displacement(  1, -1,  0),
17
	displacement(  1,  0, -1),
18
	displacement(  0,  1, -1),
19
	displacement( -1,  1,  0),
20
	displacement( -1,  0,  1),
21
	displacement(  0, -1,  1)
22
];
23
24
var diagonals = [
25
	displacement(  2, -1, -1),
26
	displacement(  1,  1, -2),
27
	displacement( -1,  2, -1),
28
	displacement( -2,  1,  1),
29
	displacement( -1, -1, +2),
30
	displacement(  1, -2,  1)
31
];
32-
function coordinate(x,z){
32+
33
function coordinate( x, z ){
34
	this.x = x;
35
	this.z = z;
36
	this.y = -(x+z);
37-
		return {x:x,z:z}
37+
38
		return {x:x,
39
				z:z}
40
	}
41
}
42-
coordinate.round = function(x,y,z){
42+
43
//-----------------------------------------------------------------
44-
	var rx = Math.round(x),
44+
45-
		ry = Math.round(y),
45+
//-----------------------------------------------------------------
46-
		rz = Math.round(z),
46+
47-
		x_err = Math.abs(rx-x),
47+
coordinate.round = function( x, y, z ){
48-
		y_err = Math.abs(ry-y),
48+
49-
		z_err = Math.abs(rz-z);
49+
	var rx = Math.round( x ),
50
		ry = Math.round( y ),
51
		rz = Math.round( z ),
52-
        rx = -(ry+rz);
52+
		x_err = Math.abs( rx - x ),
53
		y_err = Math.abs( ry - y ),
54-
        ry = -(rx+rz);
54+
		z_err = Math.abs( rz - z );
55
56-
        rz = -(rx+ry);
56+
57
        rx = -( ry + rz );
58
	}else if(y_err > z_err){
59-
	return new Coordinate(rx,rz);
59+
        ry = -( rx + rz );
60
	}else{
61
        rz = -( rx + ry );
62
	}
63-
coordinate.areEqual = function(coor1,coor2){
63+
64-
	if( !!coor1 || !!coor2 )
64+
	return new coordinate( rx, rz );
65
}
66
67
// Are they equal
68
coordinate.areEqual = function( coor1, coor2 ){
69
	if( !coor1 || !coor2 )
70
		return false;
71
72-
coordinate.prototype.equal = function(coor2){
72+
73-
	return coordinate.areEqual(this,coor2);
73+
74
			coor1.z === coor2.z;
75
}
76-
coordinate.prototype.getNeighbour =  function ( dir ){
76+
77
//-----------------------------------------------------------------
78
// Prototyped Methods
79
//-----------------------------------------------------------------
80
// Is that same as i am ?
81-
		this.z + disp.dz );
81+
coordinate.prototype.equal = function( coor2 ){
82
	return coordinate.areEqual( this, coor2 );
83
}
84
// Gets neighbour coordinate from coordinate,
85
coordinate.prototype.getNeighbour =  function ( dir, len ){
86
	len = len || 1;
87
	var disp = neighbours[dir];
88
	return new coordinate(
89
		this.x + disp.dx * len,
90
		this.y + disp.dy * len,
91
		this.z + disp.dz * len);
92
}
93
94
// Gets getDiagonal coordinate from coordinate
95
coordinate.prototype.getDiagonal = function ( dir, len ){
96
97
	len = len || 1;
98
	var disp  = diagonals[dir];
99
	
100
	disp.dx *= len;
101
	disp.dy *= len;
102
	disp.dz *= len;
103
104
	return new coordinate(
105-
	return Math.max( Math.abs(this.x - coor2.x),
105+
106-
					 Math.abs(this.y - coor2.y),
106+
107-
					 Math.abs(this.z - coor2.z) );
107+
108
	);
109
}
110
111-
	if( this.equal(coor2) )
111+
112
//We can do /2 method but i prefer this
113
//Makes more sense.
114
coordinate.prototype.distanceFrom = function( coor2 ){
115
	return Math.max( Math.abs( this.x - coor2.x ),
116
					 Math.abs( this.y - coor2.y ),
117
					 Math.abs( this.z - coor2.z ) );
118-
	N = Math.max(change.dx,change.dy,change.dz),
118+
119
120
// Returns a set of points
121
coordinate.prototype.lineTo = function( coor2 ){
122
	if( this.equal( coor2 ) )
123
		return [];
124-
	for(var i = 0; i <= N; i++ ){	
124+
125
		coor2.x - this.x,
126
		coor2.y - this.y,
127
		coor2.z - this.z
128
	),
129-
		x = this.x * fraction + coor2 * complement;
129+
	N = Math.max( change.dx, change.dy, change.dz ),
130-
		y = this.x * fraction + coor2 * complement;
130+
131-
		z = this.x * fraction + coor2 * complement;
131+
132-
		p = coordinate.round();
132+
133-
		if( !coordinate.areEqual(p,prev) ){
133+
134-
			result.push(p);
134+
	for( var i = 0; i <= N; i++ ){	
135
		// Ah fuck this is insanely stupid but oh well
136
		// TODO: find a better idea.
137
		fraction = i/N;
138
		complement = 1-fraction;
139
		x = this.x * fraction + coor2.x * complement;
140
		y = this.y * fraction + coor2.y * complement;
141
		z = this.z * fraction + coor2.z * complement;
142
		p = coordinate.round( x, y, z );
143
		if( !coordinate.areEqual( p, prev ) ){
144
			result.push( p );
145
			prev = p;
146
		}
147
	}
148
	result = result.reverse();
149-
coordinate.prototype.fromAxial = function( q, r ) {
149+
150
}
151
152
// Ring at distance Radius from hex-coordinate
153
coordinate.prototype.ring = function( Radius ){
154
	var result = [];
155
	// Get first point on ring.
156
	var temp = this.getNeighbour(4,Radius);
157
	for( var i = 0; i < 6; i ++ ){
158
		for( var j = 0; j < Radius; j++ ){
159
			result.push(temp);
160
			temp = temp.getNeighbour(i);
161
		}
162-
coordinate.prototype.fromEvenQoffset = function( q, r ) {
162+
163
	return result;
164
};
165
166
167
// Gives a region from innerRadius to outerRadius
168
// For complete region omit the second parameter
169
coordinate.prototype.region = function(outerRadius,innerRadius){
170
	innerRadius = innerRadius || 0;
171
	var result = [],ring=null;
172
	for( Radius = innerRadius; Radius <= outerRadius; Radius++ ){
173
		ring = this.ring(Radius);
174
		ring.forEach(function(element){
175-
coordinate.prototype.fromOddQoffset = function( q, r ) {
175+
			result.push(element);
176
		});
177
	}
178
	return result;
179
}
180
181
182
183
// Some helpers for representation amongst different ways to represent this data
184
// Though this should goto coordinate_utils.js
185
coordinate.prototype.toAxial = function(){
186
	return { 
187
		q:this.x,
188
		r:this.z
189-
coordinate.prototype.fromEvenRoffset = function( q, r ) {
189+
190
};
191
192
coordinate.prototype.fromAxial = function( q, r ){
193
	this.x = q;
194
	this.z = r;
195-
coordinate.prototype.toOddRoffset = function() {
195+
196
};
197
198
coordinate.prototype.toEvenQoffset = function(){
199
	return {
200
		q: x,
201
		r: z + (x + x&1)/2
202-
coordinate.prototype.fromOddRoffset = function( q, r ) {
202+
203
};
204
205
coordinate.prototype.fromEvenQoffset = function( q, r ){
206
	this.x = q;
207
	this.z = r - (q + q&1)/2;
208
	this.y = -(x+z); 
209
};
210
211
coordinate.prototype.toOddQoffset = function(){
212
	return {
213
		q: x,
214
		r: z + (x - x&1)/2
215
	}
216
};
217
218
coordinate.prototype.fromOddQoffset = function( q, r ){
219
	this.x = q;
220
	this.z = r - (q - q&1)/2;
221
	this.y = -(x+z); 
222
};
223
224
225
coordinate.prototype.toEvenRoffset = function(){
226
	return {
227
		q: x + (z + z&1)/2,
228
		r: z 
229
	}
230
};
231
232
coordinate.prototype.fromEvenRoffset = function( q, r ){
233
	this.x = q - (r + r&1)/2;
234
	this.z = r;
235
	this.y = -(x+z); 
236
};
237
238
coordinate.prototype.toOddRoffset = function(){
239
	return {
240
		q: x + (x - x&1)/2,
241
		r: z
242
	}
243
};
244
245
coordinate.prototype.fromOddRoffset = function( q, r ){
246
	this.x = q - (r - r&1)/2;
247
	this.z = r;
248
	this.y = -(x+z); 
249
};
250
251
// Export for Node
252
module.exports = coordinate;