canva标签, 绘制多边形,可拉动顶点坐标,修改多边形、获取各顶点坐标,鼠标点击判断是否在多边形内功能模块!

canva标签, 绘制多边形

直入主题!!
前端开发canva标签,
绘制多边形,可拉动顶点坐标,修改多边形、获取各顶点坐标,鼠标点击判断是否在多边形内功能模块。

使用
beginPath()
新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径。
closePath()
闭合路径之后图形绘制命令又重新指向到上下文中。
stroke()
通过线条来绘制图形轮廓。
fill()
通过填充路径的内容区域生成实心的图形。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>canvas绘制多边形</title>
    <script src="../JS/jquery.min.js"></script>
</head>

<body>
    <style>
        canvas {
            border: 1px solid #333;
            display: block;
        }
        
        input {
            width: 100px;
            margin-left: 200px;
            margin-top: 650px;
        }
        
        #canvas {
            position: absolute;
            left: 0;
            top: 0;
            z-index: 1;
            cursor: crosshair;
        }
        
        #canvasSave {
            position: absolute;
            left: 0;
            top: 0;
        }
    </style>

    <canvas id="canvas" width="1000px" height="600px"></canvas>
    <!--存储已生成的点线,避免被清空-->
    <canvas id="canvasSave" width="1000px" height="600px"></canvas>
    <input id="deleteCanvas" type="button" value="清空选区">
    <p id="testid"></p>
    <script>
        var can = document.getElementById("canvas");
        var ctx = can.getContext('2d');
        var canSave = document.getElementById("canvasSave");
        var ctxSave = canSave.getContext('2d');

        var pointX, pointY;
        var pointArr = []; //存放坐标的数组

        ctx.strokeStyle = 'rgba(102,168,255,1)'; //线条颜色
        ctx.lineWidth = 2; //线条粗细
        ctxSave.strokeStyle = 'rgba(102,168,255,1)'; //线条颜色
        ctxSave.lineWidth = 2; //线条粗细

        var oIndex = 1; //判断鼠标是否移动到起始点处,-1为否,1为是

        /*点击画点*/
        $(can).click(function(e) {
            if (e.offsetX || e.layerX) {
                pointX = e.offsetX == undefined ? e.layerX : e.offsetX;
                pointY = e.offsetY == undefined ? e.layerY : e.offsetY;
                var piX, piY;
                if (oIndex > 0 && pointArr.length > 0) {
                    piX = pointArr[0].x;
                    piY = pointArr[0].y;
                    //画点
                    makearc(ctx, piX, piY, GetRandomNum(2, 2), 0, 180, 'rgba(102,168,255,1)');
                    pointArr.push({
                        x: piX,
                        y: piY
                    });
                    canvasSave(pointArr); //保存点线同步到另一个canvas
                    saveCanvas(pointArr); //生成画布
                } else {
                    piX = pointX;
                    piY = pointY;
                    makearc(ctx, piX, piY, GetRandomNum(2, 2), 0, 180, 'rgba(102,168,255,1)');
                    pointArr.push({
                        x: piX,
                        y: piY
                    });
                    canvasSave(pointArr); //保存点线同步到另一个canvas
                }
            }
        });

        /*  */
        $(can).mousemove(function(e) {
            if (e.offsetX || e.layerX) {
                pointX = e.offsetX == undefined ? e.layerX : e.offsetX;
                pointY = e.offsetY == undefined ? e.layerY : e.offsetY;
                var piX, piY;
                /*清空画布*/
                ctx.clearRect(0, 0, can.width, can.height);
                /*鼠标下跟随的圆点*/
                makearc(ctx, pointX, pointY, GetRandomNum(4, 4), 0, 180, 'rgba(102,168,255,1)');

                if (pointArr.length > 0) {
                    if ((pointX > pointArr[0].x - 15 && pointX < pointArr[0].x + 15) && (pointY > pointArr[0].y - 15 && pointY < pointArr[0].y + 15)) {
                        if (pointArr.length > 1) {
                            piX = pointArr[0].x;
                            piY = pointArr[0].y;
                            ctx.clearRect(0, 0, can.width, can.height);
                            makearc(ctx, piX, piY, GetRandomNum(4, 4), 0, 180, 'rgba(102,168,255,1)');
                            oIndex = 1;
                        }
                    } else {
                        piX = pointX;
                        piY = pointY;
                        oIndex = -1;
                    }
                    /*开始绘制*/
                    ctx.beginPath();
                    ctx.moveTo(pointArr[0].x, pointArr[0].y);
                    if (pointArr.length > 1) {
                        for (var i = 1; i < pointArr.length; i++) {
                            ctx.lineTo(pointArr[i].x, pointArr[i].y);
                        }
                    }
                    ctx.lineTo(piX, piY);
                    ctx.fillStyle = 'rgba(161,195,255,1)'; //填充颜色
                    ctx.fill(); //填充
                    ctx.stroke(); //绘制
                }
            }
        });

        // 存储已生成的点线
        function canvasSave(pointArr) {
            ctxSave.clearRect(0, 0, ctxSave.width, ctxSave.height);
            ctxSave.beginPath();
            if (pointArr.length > 1) {
                ctxSave.moveTo(pointArr[0].x, pointArr[0].y);
                for (var i = 1; i < pointArr.length; i++) {
                    ctxSave.lineTo(pointArr[i].x, pointArr[i].y);
                    ctxSave.fillStyle = 'rgba(161,195,255,1)'; //填充颜色
                    //ctxSave.fill();
                    ctxSave.stroke(); //绘制
                }
                ctxSave.closePath();
            }
        }

        /*生成画布 结束绘画*/
        function saveCanvas() {
            ctx.clearRect(0, 0, can.width, can.height);
            ctxSave.closePath(); //结束路径状态,结束当前路径,如果是一个未封闭的图形,会自动将首尾相连封闭起来
            ctxSave.fill(); //填充
            ctxSave.stroke(); //绘制
            var description = "";
            var i = pointArr.length - 1;
            for (var i = 0; i < pointArr.length - 1; i++) {
                var property = pointArr[i];
                description += i + 1 + " = " + property.x + "," + property.y + "<br>";
            }
            document.getElementById("testid").innerHTML = description;
            pointArr = [];

        }

        /*清空选区*/
        $('#deleteCanvas').click(function() {
            ctx.clearRect(0, 0, can.width, can.height);
            ctxSave.clearRect(0, 0, canSave.width, canSave.height);
            pointArr = [];
        });

        /*验证canvas画布是否为空函数*/
        function isCanvasBlank(canvas) {
            var blank = document.createElement('canvas'); //创建一个空canvas对象
            blank.width = canvas.width;
            blank.height = canvas.height;
            return canvas.toDataURL() == blank.toDataURL(); //为空 返回true
        }

        /*canvas生成圆点*/
        function GetRandomNum(Min, Max) {
            var Range = Max - Min;
            var Rand = Math.random();
            return (Min + Math.round(Rand * Range));
        }

        function makearc(ctx, x, y, r, s, e, color) {
            ctx.clearRect(0, 0, 199, 202); //清空画布
            ctx.beginPath();
            ctx.fillStyle = color;
            ctx.arc(x, y, r, s, e);
            ctx.fill();
        }
    </script>
</body>

</html>

因代码过多 以下功能
可拉动顶点坐标,修改多边形、获取各顶点坐标,鼠标点击判断是否在多边形内功能模块。

私聊、留言、下载、可提供现成的Demo

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值