jcwallet/src/comp/JazzIcon.ts
2022-07-21 18:25:30 +08:00

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)
}
}