本案例的再次提问,主要是圆实现的思路不太懂以及closePath()

本案例的再次提问,主要是圆实现的思路不太懂以及closePath()

        canvasLock.prototype.update = function(po) {// 核心变换方法在touchmove时候调用
            this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);

            // 重新画9个圆圈
            for (var i = 0 ; i < this.arr.length ; i++) { // 每帧先把面板画出来
                this.drawCle(this.arr[i].x, this.arr[i].y);
            }

            this.drawPoint();// 画圆
            this.drawLine(po);// 画线

            // 1、检测手势移动的位置是否处于下一个圆内
            // 2、圆内的话则画圆 drawPoint
            // 3、已经画过实心圆的圆,无需重复检测
            for (var i = 0 ; i < this.restPoint.length ; i++) {
                if (Math.abs(po.x - this.restPoint[i].x) < this.r && Math.abs(po.y - this.restPoint[i].y) < this.r) {
                    this.drawPoint();
                    this.lastPoint.push(this.restPoint[i]);
                    this.restPoint.splice(i, 1);
                    break;
                }
            }

            console.log(this.lastPoint)

        }

我的理解是所有的圆找到经过手指经过的圆,然后this.drawPoint();画出来。for (var i = 0 ; i < this.restPoint.length……这段代码就是在所有未经过的圆(this.restPoint)中执行this.drawPoint();并对数组进行操作,但是this.drawPoint();是对所有(this.lastPoint)经过的圆进行操作,这个逻辑就混乱了

问题1:我知道如何做到touchmove事件中经过多个圆就画多个圆,但是如何做到经过的圆不再重复绘制不太清楚逻辑,请老师根据我思路错误的地方指正,并告诉我正确思路?

this.drawPoint();出现两次也是不理解?

       canvasLock.prototype.drawLine = function(po) {// 解锁轨迹
            this.ctx.beginPath();
            this.ctx.lineWidth = 3;
            this.ctx.moveTo(this.lastPoint[0].x, this.lastPoint[0].y);
            for (var i = 1 ; i < this.lastPoint.length ; i++) {
                this.ctx.lineTo(this.lastPoint[i].x, this.lastPoint[i].y);
            }
            this.ctx.lineTo(po.x, po.y);
            this.ctx.stroke();
            this.ctx.closePath();
        }
        canvasLock.prototype.drawPoint = function() { // 初始化圆心 
            for (var i = 0 ; i < this.lastPoint.length ; i++) {
                this.ctx.fillStyle = '#CFE6FF';
                this.ctx.beginPath();
                this.ctx.arc(this.lastPoint[i].x, this.lastPoint[i].y, this.r / 2, 0, Math.PI * 2, true);
                this.ctx.closePath();
                this.ctx.fill();
            }
        }
                canvasLock.prototype.drawCle = function(x, y) { // 初始化解锁密码面板
            this.ctx.strokeStyle = '#CFE6FF';
            this.ctx.lineWidth = 2;
            this.ctx.beginPath();
            this.ctx.arc(x, y, this.r, 0, Math.PI * 2, true);
            this.ctx.closePath();
            this.ctx.stroke();
        }

问题2:closePath()在画圆、画空心圆、画线都出现了,为什么?(老师之前解释说影响别的效果,可是我百度的结果是只有闭合路径的效果,在这里不需要)

https://class.imooc.com/course/qadetail/198564

问题3:closePath()函数与beginPath();函数几乎应该是没有关系啊,老师为什么如链接一样解释,理解为配套使用呢?

https://class.imooc.com/course/qadetail/144472

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕星星 2020-03-03 18:50:40

同学你好,问题解答如下:

1、 this.drawPoint(); 一次也是可以的,for循环里面写的可以去掉

http://img1.sycdn.imooc.com//climg/5e5e333909f8ffd205420283.jpg

2、this.restPoint是所有圆的位置,for循环中遍历所有圆的位置,将经过圆的位置存放在this.lastPoint数组中,所有圆的位置通过splice方法移除已经经过的位置,再次遍历的时候就是剩余的位置,不会再遍历所有的。例如:

this.restPoint长度为9,经过了一个圆,this.lastPoint长度为1,从this.restPoint中删除一个,长度为8,那么即将经过第二个圆时,遍历的长度也就是8 。

3、for循环中的this.drawPoint();去掉可能会好理解一些。思路如下:

(1)移动的时候,update方法会执行。在这个方法中执行的操作有:

  • 清除原来的画布

  • 重新画9个圆

  • 画经过的圆心

  • 已经经过的圆位置去除掉,下一次的时候减少遍历

(2)drawPoint方法中的操作是遍历所有经过的圆,进行圆心绘制

所以在移动过程中,移动一点点,就会重新绘制画布,重新绘制画布中的圆,重新绘制已经经过的圆心。

祝学习愉快!

好帮手慕星星 2020-03-03 13:59:34

同学你好,问题解答如下:

1、 可以这样理解,在所有未经过的圆里面,通过if条件,找到即将要经过的圆,然后this.drawPoint();

2、没有办法不重复绘制,因为在touchmove事件中调用了update方法,方法中进行了重新绘制,所以每次都是清除原来画布中的内容然后进行绘制的。

3、关于closePath()函数与beginPath()函数同学理解的没有问题,圆已经是闭合的,不需要再次闭合了,代码中可以去掉。

祝学习愉快!

  • 提问者 迷失的小麦 #1
    老师,可能我的问题没表达清楚,我再梳理一遍,麻烦老师耐心看一下我的思路想法 1.this.drawPoint();出现两次是为什么? 2.for (var i = 0 ; i < this.restPoint.length……这段代码只是对数组进行了操作并且在lastPoint所有经过的圆再画一遍,并没有对restPoint里面的圆进行操作。我的问题是:经过画过的圆就不再重复画的效果是如何实现的?(restPoint) 3.for (var i = 0 ; i < this.restPoint.length……这段代码就是在所有未经过的圆(this.restPoint)中执行this.drawPoint();并对数组进行操作,但是this.drawPoint();是对所有(this.lastPoint)经过的圆进行操作 (混乱,在restPoint的圆中对lastPoint的圆进行操作) 我的问题是:关于画圆的思路我是混乱的,麻烦老师捋一捋?
    2020-03-03 14:18:54
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师