classHeart { x = 0; y = 0; radian_cal = 0; //外部扩散 out_points = []; //内部扩散 in_points = [];
constructor() { } //初始化构建 build(radian_cal,x,y){ this.x = x; this.y = y; this.radian_cal = radian_cal; for (let i = 0; i < outPointNum; i++) { //外部扩散 let p = newPoint(); //大小+1 let outx = calX(this.radian_cal,changeSize + 1); let outy = calY(this.radian_cal,changeSize + 1); //随机大小 p.size = getRandomInt(0,2) //随机偏移坐标 p.x = getRandomInt(outx - 10,outx + 10) p.y = getRandomInt(outy - 10,outy + 10) this.out_points.push(p); } let r = getRandomInt(0,5); for (let i = 0; i < inPointNum; i++) { //内部扩散 控制随机坐标概率 要不然分布不均 会有很多在中间 let randomChangeSize ; if ( r % 2 === 0 && i % 2 === 1 ){ randomChangeSize = getRandomArbitrary(-1,initSize-1); }elseif (r % 2 === 0 || i % 2===0){ randomChangeSize = getRandomArbitrary(initSize/5,initSize-1); }elseif (i % 2 === 0){ randomChangeSize = getRandomArbitrary(initSize/2,initSize-1); }else { randomChangeSize = getRandomArbitrary(initSize-5,initSize-1); } let p = newPoint(); p.x = calX(radian_cal,randomChangeSize); p.y = calY(radian_cal,randomChangeSize); p.size = 1; p.radian_cal = radian_cal; p.change_size = randomChangeSize; this.in_points.push(p); } } //每次变化偏移计算 change(){ let diffx = calX(this.radian_cal,changeSize) let diffy = calY(this.radian_cal,changeSize) //计算便宜差值 let dx = diffx - this.x let dy = diffy - this.y this.y = diffy ; this.x = diffx ; for (let i = 0; i < this.out_points.length; i++) { //外部扩散直接加偏移量 this.out_points[i].x = this.out_points[i].x + dx this.out_points[i].y = this.out_points[i].y + dy ctx.fillRect(this.out_points[i].x,this.out_points[i].y,this.out_points[i].size,this.out_points[i].size); } for (let i = 0; i < this.in_points.length; i++) { //内部扩散 计算差值比例 保证外面的更大 let initDuffSize = initSize - this.in_points[i].change_size let currDuffSize = changeSize - this.in_points[i].change_size let inChangeSize = this.in_points[i].change_size + (currDuffSize / initDuffSize) let diffx = calX(this.in_points[i].radian_cal,inChangeSize ) let diffy = calY(this.in_points[i].radian_cal,inChangeSize) let dx = diffx - this.in_points[i].x let dy = diffy - this.in_points[i].y let luminance = inChangeSize/ 10 + changeSize / 20 ctx.fillRect(this.in_points[i].x +dx,this.in_points[i].y+dy,luminance,luminance); } } }
const heartList = [] //初始化所有坐标 while ( radian_cal <= 2*Math.PI ){ radian_cal += radian_add; let x = calX(radian_cal,initSize); let y = calY(radian_cal,initSize); let p = newHeart(); p.build(radian_cal,x,y) heartList.push(p) }
将loop方法中调用draw 改为
1 2 3
for (let i = 0; i < heartList.length; i++) { heartList[i].change(); }