@{
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;"> 平移矩形</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;"> 缩放矩形</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;"> 删除忽略区</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;"> 平移忽略区</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;"> 缩放忽略区</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>