63 lines
No EOL
1.6 KiB
Text
63 lines
No EOL
1.6 KiB
Text
import "utils/vec" for Vec
|
|
import "luxe: math" for Math
|
|
|
|
var x_angle = 1 * Num.tau / 12
|
|
var y_angle = 5 * Num.tau / 12
|
|
var z_angle = 9 * Num.tau / 12
|
|
var X_Dir = [x_angle.cos, x_angle.sin, 0]
|
|
var Y_Dir = [y_angle.cos, y_angle.sin, 0]
|
|
var Z_Dir = [z_angle.cos, z_angle.sin, 0]
|
|
|
|
class Hex{
|
|
|
|
//cheaper calculation might be possible?
|
|
//but I dont understand it so it doesnt count :V
|
|
static pos_to_coord(pos, scale){
|
|
var coords = [0, 0, 0]
|
|
|
|
scale = scale * 1.5
|
|
coords.x = Math.dot(X_Dir, pos) / scale
|
|
coords.y = Math.dot(Y_Dir, pos) / scale
|
|
coords.z = Math.dot(Z_Dir, pos) / scale
|
|
return coords
|
|
}
|
|
|
|
static pos_to_coord(pos){ pos_to_coord(pos, 1) }
|
|
|
|
static coord_to_pos(coord, scale){
|
|
var x_pos = Vec.mul(X_Dir, coord.x * scale)
|
|
var y_pos = Vec.mul(Y_Dir, coord.y * scale)
|
|
var z_pos = Vec.mul(Z_Dir, coord.z * scale)
|
|
return Vec.add(x_pos, Vec.add(y_pos, z_pos))
|
|
}
|
|
|
|
static coord_to_pos(coord){ coord_to_pos(coord, 1) }
|
|
|
|
static round(coords){
|
|
var result = [
|
|
coords.x.round,
|
|
coords.y.round,
|
|
coords.z.round
|
|
]
|
|
|
|
//if all is good, all is good
|
|
if(result.x + result.y + result.z == 0) return result
|
|
|
|
//otherwise calculate the difference rounding made
|
|
var x_diff = result.x - coords.x
|
|
var y_diff = result.y - coords.y
|
|
var z_diff = result.z - coords.z
|
|
|
|
//and recalculate the coordinate that made the biggest jump
|
|
//so the 0 sum constraint is enforced again
|
|
if(x_diff > y_diff && y_diff > z_diff) {
|
|
result.x = -result.y - result.z
|
|
} else if(y_diff > z_diff) {
|
|
result.y = -result.z - result.x
|
|
} else {
|
|
result.z = -result.x-result.y
|
|
}
|
|
|
|
return result
|
|
}
|
|
} |