97 lines
3.0 KiB
TypeScript
97 lines
3.0 KiB
TypeScript
import MersenneTwister from "../lib/mersenne-twister";
|
|
import Vec2 from "../lib/value-types/vec2";
|
|
import IconCache from "./IconCache";
|
|
|
|
|
|
export class JazzIcon{
|
|
private generator: MersenneTwister
|
|
|
|
|
|
private shapeCount = 4
|
|
|
|
private colors = []
|
|
private diameter: number;
|
|
|
|
init(address: string, diameter: number) {
|
|
this.diameter = diameter;
|
|
this.colors = [
|
|
'#01888C', // teal
|
|
'#FC7500', // bright orange
|
|
'#034F5D', // dark teal
|
|
'#F73F01', // orangered
|
|
'#FC1960', // magenta
|
|
'#C7144C', // raspberry
|
|
'#F3C100', // goldenrod
|
|
'#1598F2', // lightning blue
|
|
'#2465E1', // sail blue
|
|
'#F19E02', // gold
|
|
]
|
|
let cacheData: any = new IconCache().get(address)
|
|
if (cacheData) {
|
|
return cacheData
|
|
}
|
|
let seed = Date.now()
|
|
if (address.startsWith("0x")) {
|
|
seed = parseInt(address.slice(2, 10), 16);
|
|
}
|
|
this.generator = new MersenneTwister(seed);
|
|
// let remainingColors = this.hueShift(this.colors.slice())
|
|
this.generator.random()
|
|
let remainingColors = this.colors.slice()
|
|
let fillColor = this.genColor(this.colors)
|
|
let cache: any = { diameter, color: fillColor, paths: [] }
|
|
for(var i = 0; i < this.shapeCount - 1; i++) {
|
|
let data = this.genShape(remainingColors, diameter, i, this.shapeCount - 1)
|
|
cache.paths.push(data)
|
|
}
|
|
new IconCache().add(address, cache)
|
|
return cache;
|
|
}
|
|
|
|
genColor(colors: string[]) {
|
|
let rand = this.generator.random()
|
|
var idx = Math.floor(colors.length * this.generator.random())
|
|
var color = colors.splice(idx,1)[0]
|
|
return color;
|
|
}
|
|
|
|
hueShift(colors: string[]) {
|
|
this.generator.random()
|
|
return colors
|
|
}
|
|
genShape(remainingColors: string[], diameter: number, i: number, total: number) {
|
|
let firstRot = this.generator.random()
|
|
let angle = Math.PI * 2 * firstRot
|
|
let velocity = diameter / total * this.generator.random() + (i * diameter / total)
|
|
let tx = (Math.cos(angle) * velocity)
|
|
let ty = (Math.sin(angle) * velocity)
|
|
let c1 = new Vec2(diameter / 2, diameter / 2)
|
|
let c2 = new Vec2(tx, ty)
|
|
|
|
let secondRot = this.generator.random()
|
|
let rot = (firstRot * 360) + secondRot * 180
|
|
let angle2 = Math.PI * 2 * rot
|
|
let p0 = this.moveAndRotate(new Vec2(0, 0), c1, c2, angle2, diameter)
|
|
let p1 = this.moveAndRotate(new Vec2(0, diameter), c1, c2, angle2, diameter)
|
|
let p2 = this.moveAndRotate(new Vec2(diameter, diameter), c1, c2, angle2, diameter)
|
|
let p3 = this.moveAndRotate(new Vec2(diameter, 0), c1, c2, angle2, diameter)
|
|
let fill = this.genColor(remainingColors)
|
|
return {
|
|
color: fill,
|
|
path: [p0, p1, p2, p3]
|
|
}
|
|
// this.ctx.stroke()
|
|
}
|
|
|
|
moveAndRotate(p1: Vec2, c1: Vec2, c2: Vec2, radians: number, diameter: number) {
|
|
let x1 = c2.x - c1.x
|
|
let y1 = c2.y - c1.y
|
|
let tmpV2 = new Vec2(x1, y1)
|
|
let p2 = p1.add(tmpV2).sub(c2)
|
|
let r = p2.rotate(radians).add(c2)
|
|
let x = Math.min(Math.max(0, r.x), diameter)
|
|
let y = Math.min(Math.max(0, r.y), diameter)
|
|
return new Vec2(x, y)
|
|
}
|
|
}
|