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