请教restPoint的问题

请教restPoint的问题

(function(){
		//思路
		/*实现画圆和划线:
		1.添加事件touchstart,touchmove,touchend
		2.touchstart判断点击的位置是否处于圆圈内 getPosition,处于圆圈内则初始化,没有就不做任何操作
		 lastpoint,restpoint
		3.touchmove做的就是:画圆drawPoint 和划线 drawLine*/

		/*实现自动画圆的效果
		1.检测手势移动的位置是否处于圆内
		2.圆内的画则需要画圆
		3.但是需要检测不重复画圆*/


		//给window定义一个全局变量,因为是全局变量,所以外面可以调用,就是给传入的对象定义宽和高
		window.canvasLock = function(obj){
			this.height = obj.height;
			this.width = obj.width;
			//指一行圆圈的个数,已经在调用这个函数的里面传入了chooseType的值,所以可以直接使用
			this.chooseType = obj.chooseType;
		};

		//js方式动态生成dom
		canvasLock.prototype.initDom = function(){
			//document.createElement()是创建一个元素对象,这里是创建了一个div
			var wrap = document.createElement("div");
			//定义了一个h4标签,以及它的样式
			var str = "<h4 id='title' class='title'>绘制解锁图案</h4>";
			//为div设置样式属性
			wrap.setAttribute("style","position:absolute;top:0;left:0;right:0;bottom:0;");


			//创建一个canvas
			var canvas = document.createElement("canvas");
			//为canvas设置id
			canvas.setAttribute("id","canvas");
			//为canvas添加样式
			canvas.style.cssText = "background-color:#305066;diaplay:inline-block;margin-top:15px;";

			//把h4标签放到了div中
			wrap.innerHTML = str;
			//将canvas生成到div中
			wrap.appendChild(canvas);

			var width = this.width || 300;
			var height = this.height || 300;
			//将div放在body中
			document.body.appendChild(wrap);

			canvas.style.width = width+"px";
			canvas.style.height = height+"px";

			//将canvas的宽和高都等于上面定义的宽和高
			canvas.width = width;
			canvas.height = height;
		}


		//画圆的函数
		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,2*Math.PI*2,true);
			this.ctx.closePath();
			this.ctx.stroke();
		}


		//定义生成圆圈的函数
		canvasLock.prototype.createCircle = function(){
			//定义变量n为圆圈的个数
			var n = this.chooseType;
			var count = 0;
			//定义圆的半径为r,根据圆的半径和canvas宽度的关系计算出这个公式
			this.r = this.ctx.canvas.width/(2+4*n);

			this.lastPoint = [];

			//定义圆的中心点坐标为一个数组
			this.arr = [];

			this.restPoint = [];
			var r = this.r;
			for(var i=0;i<n;i++){
				for(var j=0;j<n;j++){
					count++;
					var obj = {
						x: j*4*r+3*r,
						y: i*4*r+3*r,
						index: count
					};
					//将obj的值存入arr中
					this.arr.push(obj);
					//将obj的值存入restPoint中
					this.restPoint.push(obj);
				}

			}

			//清除画布中的内容
			this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height);
			//循环每个arr值,将值传入画圆的函数中
			for(var i=0;i<this.arr.length;i++){
				this.drawCle(this.arr[i].x,this.arr[i].y);
			}
		}

		//给canvasLock原型上定义一个init函数,就是调用initDom,程序初始化
		canvasLock.prototype.init = function(){
			this.initDom();
			//获取canvas
			this.canvas = document.getElementById("canvas");
			this.ctx = this.canvas.getContext("2d");
			//定义一个触摸标志,初始状态为false
			this.touchFlag = false;
			//调用生成圆圈的函数
			this.createCircle();
			this.bindEvent();
		}

		canvasLock.prototype.bindEvent = function(){
			var self = this;
			//点击时的事件
			this.canvas.addEventListener("touchstart",function(e){
				//2.touchstart判断点击的位置是否处于圆圈内 getPosition,处于圆圈内则初始化,没有就不做任何操作
		 		//lastpoint,restpoint

		 		//po有x和y,并且是相较于canvas的边距
		 		var po = self.getPosition(e);

		 		//判断是否在圆内的原理,多出来的这条x或者y < r,就是在圆内
		 		for(var i=0;i<self.arr.length;i++){

		 			//Math.abs(x),是取x的绝对值
		 			//判断触点是否在圆内,如果触点到canvas边距的值减去圆中心点的坐标值小于圆的半径,则在圆内
		 			if(Math.abs(po.x - self.arr[i].x) < self.r && Math.abs(po.y - self.arr[i].y < self.r)){
		 				//touchFlag 触觉标志
		 				//当我们点击的是在圆圈以内,touchFlag就变为true
		 				self.touchFlag = true;
		 				//lastPoint存放的是选中的圆圈的X和Y轴坐标值
		 				self.lastPoint.push(self.arr[i]);
		 				self.restPoint.splice(i,1);
		 				break;
		 			}
		 		}
			},false);
			//点击之后移动的事件
			this.canvas.addEventListener("touchmove",function(e){
				if(self.touchFlag){
					self.update(self.getPosition(e));
				}
			},false);
			this.canvas.addEventListener("touchend",function(e){

			},false);
		}

		canvasLock.prototype.getPosition = function(e){
			//currentTarget 事件属性返回其监听器触发事件的节点,即当前处理该事件的元素、文档或窗口。
			//getBoundingClientRect用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。
			//所以这里rect获取的是这个事件元素相对浏览器视窗的位置
			var rect = e.currentTarget.getBoundingClientRect();
			var po = {
				//e.touches应用于移动端触摸事件,这里touches表示只用一根手指触摸
				//clientX 事件属性返回当事件被触发时鼠标指针向对于浏览器页面(或客户区)的水平坐标。
				//所以这里就是触摸时的坐标减去元素的左边和上边的坐标,得到的是相较于canvas的坐标值
				//devicePixelRatio它是设备上物理像素和设备独立像素( device-independent pixels (dips) )的比例,即 devicePixelRatio = 屏幕物理像素/设备独立像素 
				x: (e.touches[0].clientX - rect.left),
				y: (e.touches[0].clientY - rect.top)
			};
			return po;
		}

		canvasLock.prototype.update = function(po){
			//核心变换方法在touchmove时候调用
			//首先清除画布
			this.ctx.clearRect(0,0,this.ctx.canvas.width,this.ctx.canvas.height);
			//再把九个圆重新画上去
			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.圆内的画则需要画圆
			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;
                }
            }

		}
		//	画线
		canvasLock.prototype.drawLine = function(po){
			this.ctx.beginPath();
			//线条宽度为3
			this.ctx.lineWidth = 3;
			//线的起点位置为第一个点的x和y坐标
			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,2*Math.PI,true);
				this.ctx.closePath();
				this.ctx.fill();
			}
		}

})()

请问canvasLock.prototype.bindEvent 函数中的

self.restPoint.splice(i,1);

  和下面的canvasLock.prototype.update 函数中的

this.lastPoint.push(this.restPoint[i]);

       this.restPoint.splice(i, 1);


请问这两个分别是什么意思呢?不是很懂,麻烦解释下谢谢


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

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

1回答
小于飞飞 2018-06-29 16:57:12

lastPoint存放的是选中的圆圈的X和Y轴坐标值,所以this.restPoint.splice(i, 1); 理解为 从restPoint 中删除选中的原,使其不能在选了。希望解答你的疑惑,祝学习愉快。

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
HTML5&CSS3进阶与常用框架 2018
  • 参与学习       315    人
  • 提交作业       136    份
  • 解答问题       626    个

如果你有H5、CSS3、JS基础,热爱前端并希望在前端应用方面不断进步,那就来吧,本路径为你带来的课程有HTML5进阶、CSS3进阶、JS面向对象、jQ基础、Less等,助你进一步提升前端开发技能

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

在线咨询

领取优惠

免费试听

领取大纲

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