当前位置: 首页 > 科技观察

今天来复刻一颗会呼吸的心

时间:2023-03-13 16:29:11 科技观察

想了解更多开源请访问:开源基础软件社区https://ost.51cto.com今天来复刻一颗可以呼吸的心呼吸。前阵子电视剧《燃烧我,温暖你》里,一颗会呼吸的心,让很多开发者重现了...1.原剧中复刻效果的效果2.元素逆向工程分析原作剧,首先是心的轮廓。心脏内外有许多随机分布的点,心脏向内膨胀大于向外膨胀,故有呼吸作用。但显然原剧中的爱情不应该单靠代码来实现。让我们完成一个元素:最外层心脏的轮廓。轮廓周围随机分布的点。内层比外层跳动更多。如果我们想要内部和外部有不同程度的膨胀,我们可能需要使用两个画布实例,给它们添加动画,并且内部膨胀大于外部画布。3.代码实现javascriptexportdefault{data:{title:""},onInit(){this.title=this.$t('strings.world');},onShow(){this.heart();这。心脏2();},heart(){constcvs=this.$refs.canvas;constctx=cvs.getContext('2d');常量宽度=1080;常量高度=1080;//计算弧度letradian=0letradian_add=Math.PI/180//调整位置ctx.translate(width/3,height/2)//阴影ctx.shadowBlur=10//平滑角ctx.lineJoin='round'//Colorctx.shadowColor='rgba(255,255,255,1.00)'ctx.strokeStyle='rgba(255,0,114,1.00)'//用两个点阵画心,一个大一点小一点增加等级constpoints=[]constmpoints=[]while(radian<=Math.PI*2){radian+=radian_add//(x,y)表示心脏的坐标,16的心脏更大让x=这个。getX(radian,16)让y=this.getY(radian,16)points.push({x,y,//随机分布列表:newArray(10).fill('').map(v=>{constfw=100constfx=x+Math.random()*fw-fw/2constfy=y+Math.random()*fw-fw/2return{x:x,y:y,endX:fx,endY:fy,stepX:x>fx?-1:1,stepY:y>fy?-1:1,parentX:x,parentY:y}})})//保存一个较小的心脏x=this.getX(radian,14)y=this.getY(radian,14)//ctx.lineTo(x,y)mpoints.push({x,y,list:newArray(10).fill('').map(v=>{constfw=100constfx=x+Math.random()*fw-fw/2constfy=y+Math.random()*fw-fw/2return{x:x,y:y,endX:fx,endY:fy,stepX:x>fx?-1:1,stepY:y>fy?-1:1,parentX:x,parentY:y}})})}constrender=()=>{ctx.beginPath()ctx.clearRect(-width/2,-height/2,width,height)//设置粗细ctx.lineWidth=1//绘制mpoints.forEach(v=>{v.list.forEach(k=>{ctx.moveTo(k.x,k.y)ctx.lineTo(k.x+ctx.lineWidth,k.y+ctx.lineWidth)k.x+=k.stepXk.y+=k.stepYif(k.stepX>0){if(k.x>k.endX){k.x=k.endX}}else{if(k.x0){if(k.y>k.endY){k.y=k.endY}}else{if(k.y{v.list.forEach(k=>{ctx.moveTo(k.x,k.y)ctx.lineTo(k.x+ctx.lineWidth,k.y+ctx.lineWidth)k.x+=k.stepXk.y+=k.stepYif(k.stepX>0){如果(k.x>k.endX){k.x=k.endX}}else{如果(k.x0){如果(k.y>k.endY){k.y=k.endY}}else{if(k.y{v=>{ctx.lineTo(v.x,v.y)}})ctx.stroke()requestAnimationFrame(render)}render()},//依据爱心方法绘制getX(t,w){returnw*(12*Math.sin(t)-4*Math.sin(3*t))},getY(t,w,bl=1){返回(-w*(13*Math.cos(t)-5*Math.cos(2*t)-2*Math.cos(3*t)-Math.cos(4*t)))},heart2(){//代码类似,但是基于第二个canvas,心脏要小一点,以产生呼吸效果}}css.container{显示:弹性;弹性方向:列;证明内容:居中;对齐项目:居中;左:0px;顶部:0px;宽度:100%;高度:100%;background-color:black;}.my_canvas{动画:运行无限1s线性;宽度:100%;高度:100%;背景色:黑色;}.my_canvs2{位置:绝对;宽度:100%;高度:100%;z-指数:10;动画:run2无限1s线性;}@keyframes{0%{变换:比例(1);}50%{变换:比例(1.05);}100%{转换:比例(1);}}@keyframes{0%{变换:缩放(1);}50%{变换:缩放(1.2);}100%{转换:比例(1);}}hml

了解更多开源信息,请访问:开源基础软件社区https://ost.51cto.com