lifehash
Version:
TypeScript/JavaScript implementation of LifeHash, a visual hash algorithm
67 lines (66 loc) • 2.26 kB
JavaScript
import { Grid } from './Grid.js';
import { PatternType } from './Pattern.js';
import { Point } from './Point.js';
import { Size } from './Size.js';
import { Transform } from './Transform.js';
export class ColorGrid extends Grid {
constructor(frac_grid, gradient, pattern) {
let transforms;
super(ColorGrid.target_size(frac_grid.size, pattern));
if (Object.keys(ColorGrid.transforms_map).includes(pattern.toString())) {
transforms = ColorGrid.transforms_map[pattern];
}
else {
transforms = [];
}
for (const point of frac_grid.get_points()) {
const val = frac_grid.get_value(point);
const some_color = gradient(val);
this.draw(point, some_color, transforms);
}
}
color_for_value(color) {
return color;
}
static target_size(in_size, pattern) {
const multiplier = pattern === PatternType.fiducial ? 1 : 2;
return new Size(in_size.width * multiplier, in_size.height * multiplier);
}
transform_point(point, transform) {
const result = new Point(point.x, point.y);
if (transform.transpose) {
[result.x, result.y] = [result.y, result.x];
}
if (transform.reflect_x) {
result.x = this._maxX - result.x;
}
if (transform.reflect_y) {
result.y = this._maxY - result.y;
}
return result;
}
draw(point, color, transforms) {
for (const transform of transforms) {
const p2 = this.transform_point(point, transform);
this.set_value(color, p2);
}
}
}
ColorGrid.snowflake_transforms = [
new Transform(false, false, false),
new Transform(false, true, false),
new Transform(false, false, true),
new Transform(false, true, true),
];
ColorGrid.pinwheel_transforms = [
new Transform(false, false, false),
new Transform(true, true, false),
new Transform(true, false, true),
new Transform(false, true, true),
];
ColorGrid.fiducial_transforms = [new Transform(false, false, false)];
ColorGrid.transforms_map = {
0: ColorGrid.snowflake_transforms,
1: ColorGrid.pinwheel_transforms,
2: ColorGrid.fiducial_transforms,
};