动态绘制矩形和多边形


@{
    ViewBag.Title = "DouBianxing";
}

<h2>动态绘制矩形和多边形</h2>
    <canvas id="canvas" style="border:1px solid #bdb9b9; margin:0px auto;" width="300" height="300"></canvas>
    <div >
        <button class="btn btn-sm btn-success" type="button" onclick="Hua()" name="Hua">
            <i class="fa fa-square-o"></i> <span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">绘制矩形</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="PingYiHua()" name="PingYiHua">
            <i class="fa fa-square-o"></i><span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">&nbsp;平移矩形</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="SuoFangHua()" name="SuoFangHua">
            <i class="fa fa-square-o"></i><span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">&nbsp;缩放矩形</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="HuaDuoBianXing()" name="HuaDuoBianXing">
            <i class="fa fa-star-o"></i> <span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">绘制多边形</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="SuoFHuaDuoBianXing()" name="SuoFHuaDuoBianXing">
            <i class="fa fa-star-o"></i> <span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">缩放多边形</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="PingYHuaDuoBianXing()" name="SuoFHuaDuoBianXing">
            <i class="fa fa-star-o"></i> <span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">平移多边形</font></font></span>
        </button>
  
        <button class="btn btn-sm btn-success" type="button" onclick="ClerShape()" name="ClerShape">
            <i class="fa fa-star-o"></i> <span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">清空画布</font></font></span>
        </button>
    </div>
<div>
    <div class="col-lg-7">
        <button class="btn btn-sm btn-success" type="button" onclick="IHuaDuoBianXing()" name="IHuaDuoBianXing">
            <i class="fa fa-star-o"></i> <span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">绘制忽略区</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="IDeleteHuaDuoBianXing()" name="IDeleteHuaDuoBianXing">
            <i class="fa fa-star-o"></i><span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">&nbsp;删除忽略区</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="IPingYiHuaDuoBianXing()" name="IPingYiHuaDuoBianXing">
            <i class="fa fa-star-o"></i><span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">&nbsp;平移忽略区</font></font></span>
        </button>
        <button class="btn btn-sm btn-success" type="button" onclick="ISuoFangDuoBianXing()" name="ISuoFangDuoBianXing">
            <i class="fa fa-star-o"></i><span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">&nbsp;缩放忽略区</font></font></span>
        </button>
    </div>
    <div class="col-lg-5">
        <button class="btn btn-sm btn-success" type="button" onclick="IClerJuXHua()" name="IClerJuXHua">
            <i class="fa fa-trash-o"></i> <span class="bold"><font style="vertical-align: inherit;"><font style="vertical-align: inherit;">清除忽略区</font></font></span>
        </button>
    </div>
</div>
<script>
 

    //var a = -1;
    //var b = -2;
    //alert(eval( a+b))
    var can = document.getElementById("canvas");
    var ctx = can.getContext("2d");
    function DuoXY(X, Y) {
        this.x = X;
        this.y = Y;
    }
    var optionD = false;//不存在多边形
    var isActionKuang = -1;
    function HuaDuoBianXing() {
        if (optionD || operation) {
            toastr.info("已存在敏感区");
            return;
        }
        can.onmousedown = function (e) {
            if (!optionD) {
                //  alert(polygondata.length)
                Close();
                e = e || window.event;
                Jx = e.offsetX || e.layerX;//起点的X坐标
                Jy = e.offsetY || e.layerY;//起点的Y坐标
                //alert(Jx + " " + Jy);
                //X.push(Jx), Y.push(Jy)
                polygondata.push(new DuoXY(Jx, Jy));
                if (polygondata.length >= 2) {
                    if ((polygondata[0].x - 10) < Jx && Jx < (parseInt(polygondata[0].x) + 10) && (polygondata[0].y - 10) < Jy && Jy < (parseInt(polygondata[0].y) + 10)) {
                        //X.pop(); Y.pop();
                        polygondata.pop();
                        Close();
                        huaBiHeDuoBianXing(polygondata);
                        can.onmousedown = null;//重置
                        allgraph();
                        optionD = true;
                    } else {
                        Close();
                        DuoBianXing(polygondata);
                        allgraph();
                    }
                }
            };
        }
    }
    缩放多边形
    function SuoFHuaDuoBianXing() {
        can.onmousedown = function (e) {
            e = e || window.event;
            DanJiX = e.offsetX || e.layerX;//点击的X坐标
            DanJiY = e.offsetY || e.layerY;//点击的Y坐标
            //循环数组
            for (var i = 0; i < polygondata.length; i++) {
                //判断单击的点坐标是否在顶点上
                if ((parseInt(polygondata[i].x) + parseInt(10)) >= DanJiX && DanJiX >= (parseInt(polygondata[i].x) - 10) && DanJiY >= (parseInt(polygondata[i].y - 10)) && DanJiY <= (parseInt(polygondata[i].y) + parseInt(10))) {
                    var pointX = polygondata[i].x; var pointY = polygondata[i].y;//获取单击某一个的坐标
                    var n = i;
                    can.onmousemove = function (e) {
                        pingyiDX = e.offsetX || e.layerX;//平移的X坐标
                        pingyiDY = e.offsetY || e.layerY;//平移的Y坐标
                        //平移是否超出画布界限(X和Y)?(已解决)
                        if (10 <= pingyiDX && parseInt(pingyiDX) <= can.width && 10 <= pingyiDY && parseInt(pingyiDY) <= can.height) {
                            Close();
                            ctx.beginPath();
                            ctx.strokeStyle = "black";
                            ctx.moveTo(pingyiDX, pingyiDY);
                            active(pingyiDX, pingyiDY)
                            //alert("n:"+n)
                            if (n > 0) {
                                var linshipolygondata = [];
                                for (var i = 0; i < n; i++) {
                                    linshipolygondata.push(new DuoXY(polygondata[i].x, polygondata[i].y));
                                }
                                polygondata.splice(0, n)
                                polygondata = polygondata.concat(linshipolygondata)
                            }
                            for (var i = 0; i < polygondata.length; i++) {
                                ctx.lineTo(polygondata[i].x, polygondata[i].y);
                                active(polygondata[i].x, polygondata[i].y)
                            }
                            ctx.lineJoin = "round"; //线条与线条之间的连接方式
                            ctx.closePath();//表示动作完毕
                            ctx.stroke();
                            //ctx.fillStyle = "#D1E9E9";//填充的颜色
                            ctx.fillStyle = "rgba(0,255,0,0.2)";//填充的颜色
                            ctx.fill();//填充
                            polygondata[0].x = pingyiDX; polygondata[0].y = pingyiDY;
                            n = 0;
                        }
                    }
                    //结束重新绘制
                    can.onmouseup = function () {
                        Close();
                        optionD = true;
                        allgraph();
                        //can.onmousedown = null;
                        can.onmousemove = null;
                    }
                    break;
                }
            }
        }
    }
    //平移多边形
    function PingYHuaDuoBianXing() {
        var ArrayX = []; var ArrayY = [];
        console.warn("多边形数据");
        console.warn(polygondata);
        //循环数组     
        for (var i = 0; i < polygondata.length; i++) {
            ArrayX.push(polygondata[i].x); ArrayY.push(polygondata[i].y);
        }
        //最大值//最小值
        var minx = Math.min.apply(null, ArrayX); var maxx = Math.max.apply(null, ArrayX);
        //最大值//最小值
        var miny = Math.min.apply(null, ArrayY); var maxy = Math.max.apply(null, ArrayY);
        can.onmousedown = function (e) {
            e = e || window.event;
            DanJiX = e.offsetX || e.layerX;//点击的X坐标
            DanJiY = e.offsetY || e.layerY;//点击的Y坐标
            if (DanJiX >= parseInt(minx) && DanJiY >= parseInt(miny) && DanJiY <= parseInt(maxy) && DanJiX <= parseInt(maxx)) {
                can.onmousemove = function (e) {
                    pingyiDX = e.offsetX || e.layerX;//平移的X坐标
                    pingyiDY = e.offsetY || e.layerY;//平移的Y坐标
                    console.warn("pingyiDX:" + pingyiDX + "DanJiX:" + DanJiX); console.warn("pingyiDY:" + pingyiDY+"DanJiY:"+DanJiY);
                    console.warn("X方向的位移:" + (pingyiDX-DanJiX));  console.warn("Y方向的位移:" + (pingyiDY-DanJiY));
                    if (10 <= pingyiDX && parseInt(pingyiDX) <= can.width && 10 <= pingyiDY && parseInt(pingyiDY) <= can.height) {
                        var xiangduiX = pingyiDX - DanJiX; var xiangduiY = pingyiDY - DanJiY;
                        DanJiX = pingyiDX; DanJiY = pingyiDY;
                        Close();
                        for (var i = 0; i < polygondata.length; i++) {
                            polygondata[i].x = eval(polygondata[i].x + xiangduiX);
                            console.warn(polygondata[i].x);
                            polygondata[i].y = eval(polygondata[i].y + xiangduiY);
                            console.warn(polygondata[i].y);
                        }
                        allgraph();
                    }
                }
                //结束重新绘制
                can.onmouseup = function () {
                    Close();
                    optionD = true;
                    allgraph();
                    //can.onmousedown = null;
                    can.onmousemove = null;
                }
           
            }
        }
    }

    //平移矩形
    function PingYiHua() {
        can.onmousedown = function (e) {
            e = e || window.event;
            DanJiX = e.offsetX || e.layerX;//点击的X坐标
            DanJiY = e.offsetY || e.layerY;//点击的Y坐标
            if (datarectangle != null) {
                //判断单击的点坐标是否在矩形上
                if (DanJiX >= datarectangle.x && DanJiX <= (parseInt(datarectangle.x) + parseInt(datarectangle.w)) && DanJiY >= datarectangle.y && DanJiY <= (parseInt(datarectangle.y) + parseInt(datarectangle.h))) {
                    can.onmousemove = function (e) {
                        pingyiJiX = e.offsetX || e.layerX;//平移的X坐标
                        pingyiJiY = e.offsetY || e.layerY;//平移的Y坐标
                        //平移是否超出画布界限(X和Y)?(已解决)
                        if (10 <= pingyiJiX - (datarectangle.w / 2).toFixed(0) && parseInt(pingyiJiX - (datarectangle.w / 2).toFixed(0)) + parseInt(datarectangle.w) <= can.width && 10 <= pingyiJiY - (datarectangle.h / 2).toFixed(0) && parseInt(pingyiJiY - (datarectangle.h / 2).toFixed(0)) + parseInt(datarectangle.h) <= can.height) {
                            //重新绘制
                            Getredraw();
                            ctx.fillRect(pingyiJiX - (datarectangle.w / 2).toFixed(0), pingyiJiY - (datarectangle.h / 2).toFixed(0), datarectangle.w, datarectangle.h);
                            ctx.strokeRect(pingyiJiX - (datarectangle.w / 2).toFixed(0), pingyiJiY - (datarectangle.h / 2).toFixed(0), datarectangle.w, datarectangle.h);
                            //带来的问题改变了原来的(X坐标和Y坐标)?(已解决)
                            datarectangle.x = pingyiJiX - (datarectangle.w / 2).toFixed(0);
                            datarectangle.y = pingyiJiY - (datarectangle.h / 2).toFixed(0);
                            var linshi = new DateInfo(pingyiJiX - (datarectangle.w / 2).toFixed(0), pingyiJiY - (datarectangle.h / 2).toFixed(0), datarectangle.w, datarectangle.h)
                            GetActive(linshi);
                        }
                    }
                    //结束重新绘制
                    can.onmouseup = function () {
                        Close();
                        allgraph();
                        operation = true
                        //can.onmousedown = null;
                        can.onmousemove = null;
                    }
                }
            }
        }
    }

    /*画闭合多边形 */
    function huaBiHeDuoBianXing(polygondata) {
        ctx.beginPath();
        ctx.strokeStyle = "black";
        ctx.moveTo(polygondata[0].x, polygondata[0].y);
        active(polygondata[0].x, polygondata[0].y);
        for (var i = 1; i < polygondata.length; i++) {
            //alert(polygondata[i].x+":"+ polygondata[i].y)
            ctx.lineTo(polygondata[i].x, polygondata[i].y);
            active(polygondata[i].x, polygondata[i].y);
        }
        ctx.lineJoin = "round"; //线条与线条之间的连接方式
        ctx.closePath();//表示动作完毕
        ctx.stroke();
        ctx.fillStyle = "rgba(0,255,0,0.2)";;//填充的颜色
        ctx.fill();//填充

    }
    /*拼接点线*/
    function DuoBianXing(polygondata) {
        ctx.strokeStyle = "black";
        ctx.moveTo(polygondata[0].x, polygondata[0].y);
        for (var i = 1; i < polygondata.length; i++) {
            ctx.lineTo(polygondata[i].x, polygondata[i].y);
        }
        ctx.lineJoin = "round"; //线条与线条之间的连接方式
        ctx.stroke();
    }
    var Jx = null;
    var Jy = null;
    var Jw = null;
    var Jh = null;
    var polygondata = [];//
    var datarectangle = null;
    //是否有画矩形框的动作
    var operation = false
    //创建矩形对象
    function DateInfo(x, y, w, h) {
        this.x = x;
        this.y = y;
        this.w = w;
        this.h = h;
    }
    function Hua() {
        if (optionD || operation) {
            toastr.info("已存在敏感区");
            return;
        }
        can.onmousedown = function (e) {
            Close();
            optionD = false
            polygondata = [];
            e = e || window.event;
            Jx = e.offsetX || e.layerX;//起点的X坐标
            Jy = e.offsetY || e.layerY;//起点的Y坐标
            //绘制过程
            can.onmousemove = function (e) {
                e = e || window.event;
                if ((e.offsetX || e.layerX) > Jx && (e.offsetY || e.layerY) > Jy) {//左上角
                    Jw = (e.offsetX || e.layerX) - Jx
                    Jh = (e.offsetY || e.layerY) - Jy;
                }
                Getredraw();
                ctx.fillRect(Jx, Jy, Jw, Jh);
                ctx.strokeRect(Jx, Jy, Jw, Jh);
                allgraph();
            }
            // 绘制结束
            can.onmouseup = function (e) {
                //  alert($("#ObjectName").val());
                //polygondata.push(new DateInfo(Jx, Jy, Jw, Jh));
                datarectangle = new DateInfo(Jx, Jy, Jw, Jh);
                operation = true;
                Close();
                allgraph();
                can.onmousemove = null;
                can.onmouseup = null;
                can.onmousedown = null;
            };
        };
    }
    var DanJiX = null;
    var DanJiY = null;
    //缩放矩形
    function SuoFangHua() {
        can.onmousedown = function (e) {
            e = e || window.event;
            DanJiX = e.offsetX || e.layerX;//点击的X坐标
            DanJiY = e.offsetY || e.layerY;//点击的Y坐标
            if (datarectangle != null) {
                //判断点击点是否在矩形的右下角
                if ((parseInt(datarectangle.x) + parseInt(datarectangle.w)) - 20 <= DanJiX && DanJiX <= ((parseInt(datarectangle.x) + parseInt(datarectangle.w))) && DanJiY >= (parseInt(datarectangle.y) + parseInt(datarectangle.h)) - 20 && DanJiY <= (parseInt(datarectangle.y) + parseInt(datarectangle.h))) {
                    //alert(11);
                    //怎么在右下角拖动鼠标对矩形放大缩小?(以解决)
                    can.onmousemove = function (e) {
                        pingyiJiX = e.offsetX || e.layerX;//平移的X坐标
                        pingyiJiY = e.offsetY || e.layerY;//平移的Y坐标
                        //判断移动坐标是否大于左上角坐标,并且移动坐标是否超出了画布的边界
                        if (pingyiJiX > parseInt(datarectangle.x) + parseInt(10) && pingyiJiY > parseInt(datarectangle.y) + parseInt(10) && pingyiJiX <= can.width - 10 && pingyiJiY <= can.height - 10) {
                            //重新绘制
                            Getredraw();
                            ctx.fillRect(datarectangle.x, datarectangle.y, pingyiJiX - datarectangle.x, pingyiJiY - datarectangle.y);
                            ctx.strokeRect(datarectangle.x, datarectangle.y, pingyiJiX - datarectangle.x, pingyiJiY - datarectangle.y);
                            //带来的问题改变了原来的(宽和高)?(已解决)
                            datarectangle.w = pingyiJiX - datarectangle.x;
                            datarectangle.h = pingyiJiY - datarectangle.y;
                            var linshi = new DateInfo(datarectangle.x, datarectangle.y, datarectangle.w, datarectangle.h)
                            GetActive(linshi);
                        }
                    }
                    //结束重新绘制
                    can.onmouseup = function () {
                        Close();
                        allgraph();
                        operation = true
                        //can.onmousedown = null;
                        can.onmousemove = null;
                    }
                }
                //判断点击点是否在矩形的右上角
                if ((parseInt(datarectangle.x) + parseInt(datarectangle.w)) - 20 <= DanJiX && DanJiX <= ((parseInt(datarectangle.x) + parseInt(datarectangle.w) + parseInt(20))) && DanJiY >= (parseInt(datarectangle.y) - parseInt(20)) && DanJiY <= (parseInt(datarectangle.y) + parseInt(20))) {
                    //怎么在右上角拖动鼠标对矩形放大缩小?(以解决)
                    can.onmousemove = function (e) {
                        pingyiJiX = e.offsetX || e.layerX;//平移的X坐标
                        pingyiJiY = e.offsetY || e.layerY;//平移的Y坐标
                        //重新绘制
                        Getredraw();
                        if (pingyiJiX < (parseInt(datarectangle.x) + parseInt(datarectangle.w)) && pingyiJiX > parseInt(datarectangle.x) + parseInt(10)) {//向里
                            ctx.fillRect(datarectangle.x, datarectangle.y, pingyiJiX - datarectangle.x, datarectangle.h);
                            ctx.strokeRect(datarectangle.x, datarectangle.y, pingyiJiX - datarectangle.x, datarectangle.h);
                            datarectangle.w = pingyiJiX - datarectangle.x;
                        }
                        if (pingyiJiX > (parseInt(datarectangle.x) + parseInt(datarectangle.w)) && pingyiJiX < can.width - 5) {//向外
                            ctx.fillRect(datarectangle.x, datarectangle.y, pingyiJiX - datarectangle.x, datarectangle.h);
                            ctx.strokeRect(datarectangle.x, datarectangle.y, pingyiJiX - datarectangle.x, datarectangle.h);
                            datarectangle.w = pingyiJiX - datarectangle.x;
                        }

                        if (pingyiJiY < parseInt(datarectangle.y) && pingyiJiY > 10) {//向上
                            var pingyih = parseInt(datarectangle.y) - pingyiJiY;
                            ctx.fillRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(pingyih) + parseInt(datarectangle.h));
                            ctx.strokeRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(pingyih) + parseInt(datarectangle.h));
                            datarectangle.y = pingyiJiY;
                            datarectangle.h = parseInt(pingyih) + parseInt(datarectangle.h)
                        }
                        if (pingyiJiY > parseInt(datarectangle.y) && parseInt(datarectangle.h) + parseInt(datarectangle.y) < can.height - 5 && pingyiJiY < parseInt(datarectangle.h) + parseInt(datarectangle.y) - 5) {//向下

                            var pingyih = pingyiJiY - parseInt(datarectangle.y);
                            ctx.fillRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(datarectangle.h) - pingyih);
                            ctx.strokeRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(datarectangle.h) - pingyih);
                            datarectangle.y = pingyiJiY;
                            datarectangle.h = parseInt(datarectangle.h) - pingyih;
                        }

                        var linshi = new DateInfo(datarectangle.x, datarectangle.y, datarectangle.w, datarectangle.h)
                        GetActive(linshi);
                    }
                    //结束重新绘制
                    can.onmouseup = function () {
                        Close();
                        allgraph();
                        operation = true
                        //can.onmousedown = null;
                        can.onmousemove = null;
                    }
                }

                判断点击点是否在矩形的左下角
                if ((parseInt(datarectangle.x)) - 20 <= DanJiX && DanJiX <= (parseInt(datarectangle.x) + parseInt(20)) && DanJiY >= (parseInt(datarectangle.y) + parseInt(datarectangle.h) - parseInt(20)) && DanJiY <= (parseInt(datarectangle.y) + parseInt(datarectangle.h) + parseInt(20))) {
                    //alert("我是左下角");
                    //怎么在左下角拖动鼠标对矩形放大缩小?(以解决)
                    can.onmousemove = function (e) {
                        pingyiJiX = e.offsetX || e.layerX;//平移的X坐标
                        pingyiJiY = e.offsetY || e.layerY;//平移的Y坐标
                        //重新绘制
                        Getredraw();

                        if (pingyiJiX > datarectangle.x && parseInt(datarectangle.x) + datarectangle.w <= can.width - 5) {//向里
                            var pingyiw = pingyiJiX - datarectangle.x;
                            ctx.fillRect(pingyiJiX, datarectangle.y, datarectangle.w - pingyiw, datarectangle.h);
                            ctx.strokeRect(pingyiJiX, datarectangle.y, datarectangle.w - pingyiw, datarectangle.h);
                            datarectangle.x = pingyiJiX;
                            if (datarectangle.w - pingyiw < 10) {
                                datarectangle.h = 10;
                            } else {
                                datarectangle.w = datarectangle.w - pingyiw;
                            }
                            datarectangle.h = datarectangle.h
                        }
                        if (pingyiJiX < datarectangle.x && pingyiJiX > 10) {//向外
                            var pingyiw = datarectangle.x - pingyiJiX;
                            ctx.fillRect(pingyiJiX, datarectangle.y, parseInt(datarectangle.w) + pingyiw, datarectangle.h);
                            ctx.strokeRect(pingyiJiX, datarectangle.y, parseInt(datarectangle.w) + pingyiw, datarectangle.h);
                            datarectangle.x = pingyiJiX;
                            datarectangle.w = parseInt(datarectangle.w) + pingyiw;
                        }
                        if (pingyiJiY > (parseInt(datarectangle.y) + parseInt(datarectangle.h)) && parseInt(datarectangle.y) + datarectangle.h <= can.height - 5) {//向下
                            var pingyih = pingyiJiY - (parseInt(datarectangle.y) + parseInt(datarectangle.h));
                            ctx.fillRect(datarectangle.x, datarectangle.y, datarectangle.w, pingyih + parseInt(datarectangle.h));
                            ctx.strokeRect(datarectangle.x, datarectangle.y, datarectangle.w, pingyih + parseInt(datarectangle.h));
                            datarectangle.h = pingyih + parseInt(datarectangle.h);
                        }
                        if (pingyiJiY < (parseInt(datarectangle.y) + parseInt(datarectangle.h))) { //向上
                            var pingyih = (parseInt(datarectangle.y) + parseInt(datarectangle.h)) - pingyiJiY;
                            ctx.fillRect(datarectangle.x, datarectangle.y, datarectangle.w, pingyih);
                            ctx.strokeRect(datarectangle.x, datarectangle.y, datarectangle.w, pingyih);
                            if (pingyih < 10) {
                                datarectangle.h = 10;
                            } else {
                                datarectangle.h = pingyih;
                            }
                        }
                        //带来的问题改变了原来的(宽和高)?(已解决)
                        //带来的问题改变了原来的(宽和高)?(已解决)

                        var linshi = new DateInfo(datarectangle.x, datarectangle.y, datarectangle.w, datarectangle.h)
                        GetActive(linshi);
                    }
                    //结束重新绘制
                    can.onmouseup = function () {
                        Close();
                        allgraph();
                        operation = true
                        //can.onmousedown = null;
                        can.onmousemove = null;
                    }

                }
                判断点击点是否在矩形的左上角
                if ((parseInt(datarectangle.x)) - 20 <= DanJiX && DanJiX <= (parseInt(datarectangle.x) + parseInt(20)) && (parseInt(datarectangle.y)) - 20 <= DanJiY && DanJiY <= (parseInt(datarectangle.y) + parseInt(20))) {
                    //alert("我是左上角");
                    //怎么在左上角拖动鼠标对矩形放大缩小?(以解决)
                    can.onmousemove = function (e) {
                        pingyiJiX = e.offsetX || e.layerX;//平移的X坐标
                        pingyiJiY = e.offsetY || e.layerY;//平移的Y坐标
                        //重新绘制
                        Getredraw();
                        if (pingyiJiX > datarectangle.x && parseInt(datarectangle.x) + datarectangle.w <= can.width - 10) {//向里
                            var pingyiw = pingyiJiX - datarectangle.x;
                            ctx.fillRect(pingyiJiX, datarectangle.y, datarectangle.w - pingyiw, datarectangle.h);
                            ctx.strokeRect(pingyiJiX, datarectangle.y, datarectangle.w - pingyiw, datarectangle.h);
                            datarectangle.x = pingyiJiX;
                            if (datarectangle.w - pingyiw < 10) {
                                datarectangle.w = 10;
                            } else {
                                datarectangle.w = datarectangle.w - pingyiw;
                            }
                        }
                        if (pingyiJiX < datarectangle.x && pingyiJiX > 10) {//向外
                            var pingyiw = datarectangle.x - pingyiJiX;
                            ctx.fillRect(pingyiJiX, datarectangle.y, parseInt(datarectangle.w) + pingyiw, datarectangle.h);
                            ctx.strokeRect(pingyiJiX, datarectangle.y, parseInt(datarectangle.w) + pingyiw, datarectangle.h);
                            datarectangle.x = pingyiJiX;
                            datarectangle.w = parseInt(datarectangle.w) + pingyiw;
                        }
                        if (pingyiJiY > parseInt(datarectangle.y) && parseInt(datarectangle.y) + datarectangle.h <= can.height - 5) {//向下
                            var pingyih = pingyiJiY - parseInt(datarectangle.y);
                            ctx.fillRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(datarectangle.h) - pingyih);
                            ctx.strokeRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(datarectangle.h) - pingyih);
                            datarectangle.y = pingyiJiY;

                            if (parseInt(datarectangle.h) - pingyih < 10) {
                                datarectangle.h = 10;
                            } else {
                                datarectangle.h = parseInt(datarectangle.h) - pingyih;
                            }
                        }
                        if (pingyiJiY < parseInt(datarectangle.y) && pingyiJiY > 10) { //向上
                            var pingyih = parseInt(datarectangle.y) - pingyiJiY;
                            ctx.fillRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(datarectangle.h) + pingyih);
                            ctx.strokeRect(datarectangle.x, pingyiJiY, datarectangle.w, parseInt(datarectangle.h) + pingyih);
                            datarectangle.y = pingyiJiY;
                            datarectangle.h = parseInt(datarectangle.h) + pingyih;
                        }
                        //带来的问题改变了原来的(宽和高)?(已解决)
                        //带来的问题改变了原来的(宽和高)?(已解决)
                        var linshi = new DateInfo(datarectangle.x, datarectangle.y, datarectangle.w, datarectangle.h)
                        GetActive(linshi);
                    }
                    can.onmouseup = function () {
                        Close();
                        allgraph();
                        operation = true
                        //can.onmousedown = null;
                        can.onmousemove = null;
                    }
                }
            }
        }
    }

    //清除画布
    function ClerShape() {
        operation = false;
        optionD = false;
        Close();
        //清空数组
        polygondata = [];
        datarectangle = null;
        allgraph();
    }
    //绘制矩形
    function Juxing(datarectangle) {
        ctx.lineWidth = 1;
        ctx.strokeStyle = 'black';
        ctx.fillStyle = "rgba(0,255,0,0.2)";
        //alert(datarectangle.x + "," + datarectangle.y + "," + datarectangle.w + "," + datarectangle.h);
        ctx.fillRect(datarectangle.x, datarectangle.y, datarectangle.w, datarectangle.h);
        ctx.strokeRect(datarectangle.x, datarectangle.y, datarectangle.w, datarectangle.h);
        GetActive(datarectangle)
    }
    //使用小方框来替换定点
    function active(x, y) {
        K = 8;
        ctx.strokeStyle = "blue"
        ctx.lineWidth = 1;
        ctx.strokeRect(x - (K / 2), y - (K / 2), K, K);
        ctx.stroke();
        ctx.strokeStyle = 'black'
    }
    //获取小方框
    function GetActive(d) {
        active(d.x, d.y)
        active(parseInt(d.x) + parseInt(d.w), d.y)
        active(parseInt(d.x), parseInt(d.y) + parseInt(d.h))
        active(parseInt(d.x) + parseInt(d.w), parseInt(d.y) + parseInt(d.h))
    }
    //重置配置
    function Getredraw() {
        ctx.clearRect(0, 0, can.width, can.height);
        ctx.lineWidth = 1;
        ctx.strokeStyle = 'black';
        ctx.fillStyle = "rgba(0,255,0,0.2)";
    }
    //临时清除
    function Close() {
        var width = can.width;
        var height = can.height;
        can.width = 0;
        can.height = 0;
        can.width = width;
        can.height = height;
        ctx.clearRect(0, 0, can.width, can.height);
    }  
    //所有的图形
    function allgraph() {
        //Close();
        if (optionD) {
            huaBiHeDuoBianXing(polygondata);
        }
        if (operation) {
            if (datarectangle != null) {
                Juxing(datarectangle);
            }
        }
        AllignoreShow();
    }




    //#region   忽略区
    var Allignore = new Array();
    var Idatadraw = [];
    //绘制忽略区
    function IHuaDuoBianXing() {
        if (Allignore.length < 3) {
            allgraph();
            Close();
            can.onmousedown = function (e) {
                e = e || window.event;
                Jx = e.offsetX || e.layerX;//起点的X坐标
                Jy = e.offsetY || e.layerY;//起点的Y坐标
                can.onmouseup = function () {
                    Idatadraw.push(new DuoXY(Jx, Jy));
                    if (Idatadraw.length > 1) {
                        allgraph();
                        Close();
                        if (Idatadraw.length >= 2) {
                            if ((Idatadraw[0].x - 10) < Jx && Jx < (parseInt(Idatadraw[0].x) + 10) && (Idatadraw[0].y - 10) < Jy && Jy < (parseInt(Idatadraw[0].y) + 10)) {
                                //X.pop(); Y.pop();
                                Idatadraw.pop();
                                Allignore.push(Idatadraw)
                                //AllignoreShow();
                                can.onmousedown = null;//重置
                                Idatadraw = [];
                                allgraph();
                            } else {
                                allgraph();
                                DuoBianXing(Idatadraw)
                            };
                        }
                    } else {
                        allgraph();
                    }

                }
            }
        } else {
            alert("目前最多支持三个忽略区")
        }
    }
    //删除忽略区
    function IDeleteHuaDuoBianXing() {
      
        can.onmousedown = function (e) {
            e = e || window.event;
            DanJiX = e.offsetX || e.layerX;//点击的X坐标
            DanJiY = e.offsetY || e.layerY;//点击的Y坐标
            //循环数组
            var linshiJuxing = new Array();
            for (var m = 0; m < Allignore.length; m++) {
                var X = [];
                var Y = [];
                var Idata = Allignore[m]
                for (var i = 0; i < Idata.length; i++) {
                    X[i] = Idata[i].x; Y[i] = Idata[i].y
                }
                //获取多边形X数组最大值
                var maxX = Math.max.apply(null, X);
                var minX = Math.min.apply(null, X);
                var maxY = Math.max.apply(null, Y);
                var minY = Math.min.apply(null, Y);
                var linshiW = maxX - minX; var linshiH = maxY - minY;
                linshiJuxing.push(new DateInfo(minX, minY, linshiW, linshiH))
            }
            //循环数组
            for (var i = 0; i < linshiJuxing.length; i++) {
                //判断单击的点坐标是否在矩形上
                if (DanJiX >= linshiJuxing[i].x && DanJiX <= (parseInt(linshiJuxing[i].x) + parseInt(linshiJuxing[i].w)) && DanJiY >= linshiJuxing[i].y && DanJiY <= (parseInt(linshiJuxing[i].y) + parseInt(linshiJuxing[i].h))) {
                    //alert("选中我了" + i);
                    if (confirm("你确定要删除吗")) {
                        //Idata.splice(i, 1);
                        Allignore.splice(i, 1);
                        Close();
                        allgraph();
                        //can.onmousedown = null;
                        break;
                    } else {
                        //can.onmousedown = null;
                    }
                }
            }
        }
    }
    //平移忽略区
    function IPingYiHuaDuoBianXing() {
        can.onmousedown = function (e) {
            e = e || window.event;
            DanJiX = e.offsetX || e.layerX;//点击的X坐标
            DanJiY = e.offsetY || e.layerY;//点击的Y坐标
            var n;      
            for (var i = 0; i < Allignore.length; i++) {
                var ArrayX = []; var ArrayY = [];
                //循环数组     
                var singerignore = Allignore[i];
                for (var j = 0; j < singerignore.length; j++) {
                    ArrayX.push(singerignore[j].x); ArrayY.push(singerignore[j].y);
                }
                console.warn("ArrayX"); console.warn(ArrayX);
                console.warn("ArrayY"); console.warn(ArrayY);
                //最大值//最小值
                var minx = Math.min.apply(null, ArrayX); var maxx = Math.max.apply(null, ArrayX);
                //最大值//最小值
                var miny = Math.min.apply(null, ArrayY); var maxy = Math.max.apply(null, ArrayY);
                if (DanJiX >= parseInt(minx) && DanJiY >= parseInt(miny) && DanJiY <= parseInt(maxy) && DanJiX <= parseInt(maxx)) {
                    n = i;
                    //alert(n);
                    break;
                }
            }
            can.onmousemove = function (e) {
                pingyiDX = e.offsetX || e.layerX;//平移的X坐标
                pingyiDY = e.offsetY || e.layerY;//平移的Y坐标          
                //console.warn("pingyiDX:" + pingyiDX + "DanJiX:" + DanJiX); console.warn("pingyiDY:" + pingyiDY + "DanJiY:" + DanJiY);
                //console.warn("X方向的位移:" + (pingyiDX - DanJiX)); console.warn("Y方向的位移:" + (pingyiDY - DanJiY));
                if (10 <= pingyiDX && parseInt(pingyiDX) <= can.width && 10 <= pingyiDY && parseInt(pingyiDY) <= can.height) {
                    var xiangduiX = pingyiDX - DanJiX; var xiangduiY = pingyiDY - DanJiY;
                    DanJiX = pingyiDX; DanJiY = pingyiDY;
                    Close();
                    var updategnore = Allignore[n];
                    console.warn("updategnore"); console.warn(updategnore);
                    for (var k = 0; k < updategnore.length; k++) {
                        updategnore[k].x = parseInt(updategnore[k].x) + parseInt(xiangduiX);
                        console.warn(updategnore[k].x);
                        updategnore[k].y = parseInt(updategnore[k].y) + parseInt(xiangduiY);
                        console.warn(updategnore[k].y);
                    }
                    Allignore[n] = updategnore;
                    allgraph();
                }
            }
            //结束重新绘制
            can.onmouseup = function () {
                Close();          
                allgraph();
                //can.onmousedown = null;
                can.onmousemove = null;
            }

        }
    }


    //缩放忽略区
    function ISuoFangDuoBianXing() {
        console.warn("Allignore"); console.warn(Allignore);
        can.onmousedown = function (e) {
            e = e || window.event;
            DanJiX = e.offsetX || e.layerX;//点击的X坐标
            DanJiY = e.offsetY || e.layerY;//点击的Y坐标
       
            var m;
            for (var i = 0; i < Allignore.length; i++) {
                var singerignore = Allignore[i];
                for (var j= 0; j< singerignore.length; j++) {
                    if ((parseInt(singerignore[j].x) + parseInt(10)) >= DanJiX && DanJiX >= (parseInt(singerignore[j].x) - 10) && DanJiY >= (parseInt(singerignore[j].y - 10)) && DanJiY <= (parseInt(singerignore[j].y) + parseInt(10))) {
                        m = i;
                        break;
                    }
                }
            }
            if (m != null) {
                console.warn("updatagnore"); console.warn(Allignore[m]);
                var updatagnore = Allignore[m];
                //循环数组
                for (var i = 0; i < updatagnore.length; i++) {
                    //判断单击的点坐标是否在顶点上
                    if ((parseInt(updatagnore[i].x) + parseInt(10)) >= DanJiX && DanJiX >= (parseInt(updatagnore[i].x) - 10) && DanJiY >= (parseInt(updatagnore[i].y - 10)) && DanJiY <= (parseInt(updatagnore[i].y) + parseInt(10))) {
                        var pointX = updatagnore[i].x; var pointY = updatagnore[i].y;//获取单击某一个的坐标
                        var n = i;
                        can.onmousemove = function (e) {
                            pingyiDX = e.offsetX || e.layerX;//平移的X坐标
                            pingyiDY = e.offsetY || e.layerY;//平移的Y坐标
                            //平移是否超出画布界限(X和Y)?(已解决)
                            if (10 <= pingyiDX && parseInt(pingyiDX) <= can.width && 10 <= pingyiDY && parseInt(pingyiDY) <= can.height) {
                                Close();
                                ctx.beginPath();
                                ctx.strokeStyle = "black";
                                ctx.moveTo(pingyiDX, pingyiDY);
                                active(pingyiDX, pingyiDY)
                                //alert("n:"+n)
                                if (n > 0) {
                                    var linshipolygondata = [];
                                    for (var i = 0; i < n; i++) {
                                        linshipolygondata.push(new DuoXY(updatagnore[i].x, updatagnore[i].y));
                                    }
                                    updatagnore.splice(0, n)
                                    updatagnore = updatagnore.concat(linshipolygondata)
                                }
                                for (var i = 0; i < updatagnore.length; i++) {
                                    ctx.lineTo(updatagnore[i].x, updatagnore[i].y);
                                    active(updatagnore[i].x, updatagnore[i].y)
                                }
                                ctx.lineJoin = "round"; //线条与线条之间的连接方式
                                ctx.closePath();//表示动作完毕
                                ctx.stroke();
                                //ctx.fillStyle = "#D1E9E9";//填充的颜色
                                ctx.fillStyle = "rgba(255,252,153,0.2)";//填充的颜色
                                ctx.fill();//填充
                                updatagnore[0].x = pingyiDX; updatagnore[0].y = pingyiDY;
                                n = 0;
                            }
                        }
                        //结束重新绘制
                        can.onmouseup = function () {
                            Close();
                            Allignore[m] = updatagnore;
                            m = null;
                            //optionD = true;
                            allgraph();
                            //can.onmousedown = null;
                            can.onmousemove = null;
                        }
                        break;
                    }
                }

            }

        }
    }

    //清除忽略区
    function IClerJuXHua() {
  
        Allignore = new Array();//清空数组
        Close();
        allgraph();
    }
    //所有的忽略区
    function AllignoreShow() {
        if (Allignore.length > 0) {
            for (var i = 0; i < Allignore.length; i++) {
                IhuaBiHeDuoBianXing(Allignore[i]);
            }
        }
    }
    /*画闭合忽略区多边形 */
    function IhuaBiHeDuoBianXing(data) {
        ctx.beginPath();
        //ctx.strokeStyle = "red";
        ctx.moveTo(data[0].x, data[0].y);
        for (var i = 1; i < data.length; i++) {
            ctx.lineTo(data[i].x, data[i].y);
        }
        ctx.lineJoin = "round"; //线条与线条之间的连接方式
        ctx.closePath();//表示动作完毕
        ctx.stroke();
        ctx.fillStyle = "rgba(255,252,153,0.2)";//填充的颜色
        ctx.fill();//填充
    }
    //#endregion
</script>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity是一款功能强大的游戏开发引擎,它可以使用脚本语言编写代码来实现各种功能。在Unity中,我们可以使用Mesh来绘制多边形。 首先,我们需要创建一个空物体,然后在其上添加一个MeshFilter和一个MeshRenderer组件。MeshFilter用来存储多边形顶点信息,而MeshRenderer用于显示多边形。 接下来,我们需要使用代码来动态构建多边形顶点和三角形索引。我们可以使用Vector3数组来存储多边形顶点位置,并且使用int数组来存储多边形的三角形索引。 例如,我们想要绘制一个矩形,可以通过以下步骤来实现: 1. 创建一个Vector3数组来存储矩形的四个顶点的位置。 Vector3[] vertices = new Vector3[4]; 2. 设置矩形的四个顶点的位置。 vertices[0] = new Vector3(0, 0, 0); vertices[1] = new Vector3(1, 0, 0); vertices[2] = new Vector3(0, 1, 0); vertices[3] = new Vector3(1, 1, 0); 3. 创建一个int数组来存储矩形的两个三角形的顶点索引。 int[] triangles = new int[6]; 4. 设置矩形的两个三角形的顶点索引。 triangles[0] = 0; triangles[1] = 2; triangles[2] = 1; triangles[3] = 2; triangles[4] = 3; triangles[5] = 1; 5. 将顶点数组和三角形索引数组赋值给MeshFilter的mesh属性。 Mesh mesh = GetComponent<MeshFilter>().mesh; mesh.vertices = vertices; mesh.triangles = triangles; 6. 最后,我们需要更新Mesh的各种属性,例如法线、UV坐标等。 mesh.RecalculateNormals(); mesh.RecalculateBounds(); mesh.RecalculateTangents(); 通过上述步骤,我们就可以在Unity中动态构建Mesh并绘制多边形了。当然,根据实际需求,我们可以使用更复杂的算法来构建更复杂的多边形

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值