Canvas判断线段是否重叠

比如我们,想画一个完整的闭合的矩形,那我们就不能让线段进行重叠

在这里插入图片描述
那线段重叠了,判断的方法呢
在这里插入图片描述

 canvas.onmouseup = function (e) {
            e = e || window.event;

            //let gx = e.clientX - canvas.getBoundingClientRect().left;
            //let gy = e.clientY - canvas.getBoundingClientRect().top;
			// 这个是画点的位置的 小矩形,方便 好看一些
            //ctx.clearRect(0,0,canvas.width,canvas.height);
            //ctx.drawImage(tc,0,0,canvas.width,canvas.height);
            //ctx.beginPath();
            //ctx.fillStyle = "rgb(255,255,255)";
            //ctx.fillRect(gx - 4, gy - 4, 8, 8);

            //ctx.moveTo(points[0].x,points[0].y);

            //for (let i = 0; i < points.length; i++) {
                //if (i >= 0) ctx.lineTo(points[i].x , points[i].y);
            //}

            //if(flag) ctx.closePath();
            //ctx.stroke();
            
            // points 存的是每个点的位置
            // const points = [
		    //     {x: 344, y: 210.875},
		    //     {x: 751, y: 138.875},
		    //     {x: 710, y: 333.875},
		    //     {x: 417, y: 401.875},
		    //     {x: 416, y: 166.875}
		    // ];
            for(let i=0,j=points.length; i< j; i++) {
                if(i>=1 && i<j-1) {
                    let data = [];
                    //这个的意思是把 每个点 都变成线段 看有没有重叠的
                    data[0] = points[i-1];
                    data[1] = points[i-0];
                    data[2] = points[j-2];
                    data[3] = points[j-1];
              		
                    if(intersects(data)) {
                    	// 有数据 说明已经有交叉的线段了
                    	// 你可以写相应的 报错提示信息
                        //...
                    }
                }
            }
        };

	
	 // 确定是否有交叉口
	  function intersects(seg) {
        let p = intersection(seg); 
        p = p.split(",");
      
        let Boole = p[0] > Math.min(seg[0].x, seg[1].x) && p[0] < Math.max(seg[0].x, seg[1].x) && p[0] > Math.min(seg[2].x, seg[3].x) && p[0] < Math.max(seg[2].x, seg[3].x);
        if(Boole){
            return p;  
        }
    };

    function intersection(seg) {
        let x1 = seg[0].x,
            y1 = seg[0].y,
            x2 = seg[1].x,
            y2 = seg[1].y,
            x3 = seg[2].x,
            y3 = seg[2].y,
            x4 = seg[3].x,
            y4 = seg[3].y,
            nx, ny, d;

        d = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
        nx = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);
        ny = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);
        return Math.round(nx / d)+","+ Math.round(ny / d);
    };
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值