console
var points = {
rect1: [
{ x: 20, y: 20, isSelected: false },
{ x: 120, y: 20, isSelected: false },
{ x: 120, y: 120, isSelected: false },
{ x: 20, y: 120, isSelected: false },
],
rect2: [
{ x: 140, y: 20, isSelected: false },
{ x: 240, y: 20, isSelected: false },
{ x: 240, y: 120, isSelected: false },
{ x: 140, y: 120, isSelected: false },
]
}
var moved = false
var mouseInit = {}
function drawRect(Array) {
context.lineJoin = 'round'
context.beginPath()
for (let i = 0; i < Array.length; i++) {
const ele = Array[i];
if (i < 1) {
context.moveTo(ele.x, ele.y);
} else {
context.lineTo(ele.x, ele.y);
}
}
context.lineWidth = 3;
if (Array == points.rect1) {
context.strokeStyle = 'red'
} else {
context.strokeStyle = 'green'
}
context.closePath();
context.stroke();
drawArc(Array)
}
function drawArc(Array) {
for (let i = 0; i < Array.length; i++) {
const ele = Array[i];
context.beginPath()
context.lineWidth = 3;
context.fillStyle = '#FFF'
context.arc(ele.x, ele.y, 5, 0, Math.PI * 2, false);
if (Array == points.rect1) {
context.strokeStyle = 'red'
} else {
context.strokeStyle = 'green'
}
context.closePath();
context.fill();
context.stroke();
}
}
function drawRects() {
context.clearRect(0, 0, canvas.width, canvas.height);
drawRect(points.rect1)
drawRect(points.rect2)
}
var selectObject
function circle(Array, clientX, clientY) {
for (let i = 0; i < Array.length; i++) {
const ele = Array[i];
var line = Math.abs(Math.sqrt(Math.pow((ele.x - clientX), 2) + Math.pow((ele.y - clientY), 2)))
if (line - 5 < 0) {
ele.isSelected = true
isDragging = true
selectObject = Array[i]
} else {
ele.isSelected = false
}
}
}
function inCircle(Array, clientX, clientY) {
let t = false
for (let i = 0; i < Array.length; i++) {
const ele = Array[i];
var line = Math.abs(Math.sqrt(Math.pow((ele.x - clientX), 2) + Math.pow((ele.y - clientY), 2)))
if (line - 5 < 0) {
t = true
}
}
return t
}
function clickPoint(e) {
var ev = window.event || e;
var clientX = e.clientX - this.offsetLeft;
var clientY = e.clientY - this.offsetTop;
isDragging = true
circle(points.rect1, clientX, clientY)
circle(points.rect2, clientX, clientY)
let point = {
x: e.offsetX,
y: e.offsetY
}
if (isIn(point, points, e).isRect) {
moved = true
mouseInit = point
} else {
moved = false
}
}
var isDragging = false
function dragCircle(e) {
let point = {
x: e.offsetX,
y: e.offsetY
}
if (isIn(point, points, e).isRect) {
canvas.style.cursor = 'move'
} else {
if (isIn(point, points, e).isC) {
canvas.style.cursor = 'pointer'
} else {
canvas.style.cursor = 'default'
}
}
if (isDragging && !moved) {
var clickX = e.pageX - canvas.offsetLeft;
var clickY = e.pageY - canvas.offsetTop;
selectObject.x = clickX
selectObject.y = clickY
drawRects()
}
if (moved) {
throttle(_drawRects)(e, point)
}
}
function isIn(pt, objs, e) {
let arrKeys = Object.keys(objs)
let t = false
let tc = false
let keys = ''
for (let i = 0; i < arrKeys.length; i++) {
if (pointInPoly(pt, objs[arrKeys[i]])) {
t = true
keys = arrKeys[i]
}
if (!tc) {
tc = inCircle(objs[arrKeys[i]], e.offsetX, e.offsetY)
}
}
return {
isRect: t,
isC: tc,
keys: keys
}
}
function pointInPoly(pt, poly) {
for (var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i) {
((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
&& (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
&& (c = !c);
}
return c;
}
function stopDragging() {
isDragging = false
moved = false
mouseInit = {}
selectObject = {}
}
function _drawRects(e, point) {
let movex = e.offsetX - mouseInit.x
let movey = e.offsetY - mouseInit.y
let arrKeys = Object.keys(points)
mouseInit.x = e.offsetX
mouseInit.y = e.offsetY
for (let i = 0; i < arrKeys.length; i++) {
if (isIn(point, points, e).keys === arrKeys[i]) {
points[arrKeys[i]].map((item, index) => {
item.x = item.x + movex
item.y = item.y + movey
})
}
}
drawRects()
}
function stopDragging() {
isDragging = false
moved = false
selectObject = {}
}
function throttle(fn, time = 10) {
let timer = null
return (...args) => {
if (!timer) {
timer = setTimeout(() => {
fn.apply(null, args)
timer = null
}, time)
}
}
}
var canvas = document.getElementById('canvas')
var context = canvas.getContext('2d')
drawRects()
canvas.onmousedown = clickPoint;
canvas.onmouseup = stopDragging;
canvas.onmousemove = dragCircle
<!-- <div class="head">
<label for="red">红色框</label>
<input id="red" max=5 min=0 step=1 type="number"/>
<label for="green">绿色框</label>
<input id="green" max=5 min=0 step=1 type="number"/>
</div> -->
<canvas id="canvas" width="800" height="600"></canvas>
.head{
height: 50px;
line-height: 50px;
}
canvas{
background-color: #333
}