const points = [];
for (let i = 0; i < 6; i++) { let point = { x: 150 + 50 * Math.cos((2 * Math.PI * i) / 6), y: 150 + 50 * Math.sin((2 * Math.PI * i) / 6), };
points.push(point); }
const canvas = document.getElementById("canvas1"); const ctx = canvas.getContext("2d");
paint();
function paint() { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = "rgba(0, 0, 0, 0.2)"; ctx.fillRect(0, 0, canvas.width, canvas.height);
ctx.beginPath(); let startPoint = points[0]; ctx.moveTo(startPoint.x, startPoint.y); for (let i = 1; i < 6; i++) { let point = points[i]; ctx.lineTo(point.x, point.y); } ctx.closePath(); ctx.strokeStyle = "#1890FF"; ctx.lineWidth = 2; ctx.stroke(); ctx.fillStyle = "#D0E8FF"; ctx.fill(); }
function rayCasting(p, poly) { var px = p.x, py = p.y, flag = false;
for (var i = 0, l = poly.length, j = l - 1; i < l; j = i, i++) { var sx = poly[i].x, sy = poly[i].y, tx = poly[j].x, ty = poly[j].y;
if ((sx === px && sy === py) || (tx === px && ty === py)) { return true; }
if ((sy < py && ty >= py) || (sy >= py && ty < py)) { var x = sx + ((py - sy) * (tx - sx)) / (ty - sy);
if (x === px) { return true; }
if (x > px) { flag = !flag; } } }
return flag; }
let isInGraphics = false;
let startMovePoint = null; let canMove = false;
canvas.onmousemove = function (e) { const point = { x: e.offsetX, y: e.offsetY, };
isInGraphics = rayCasting(point, points);
if (isInGraphics) { canvas.style.cursor = "move"; } else { canvas.style.cursor = "auto"; }
if (isInGraphics && canMove) { updatePoints(point); } };
canvas.onmousedown = function (e) { const point = { x: e.offsetX, y: e.offsetY, };
if (!isInGraphics) { return; } startMovePoint = point; canMove = true; };
document.onmouseup = function (e) { canMove = false; };
function updatePoints(stopMovePoint) { const disX = stopMovePoint.x - startMovePoint.x; const disY = stopMovePoint.y - startMovePoint.y; startMovePoint = stopMovePoint
const xArr = points.reduce((acc, cur) => [...acc, cur.x], []); const yArr = points.reduce((acc, cur) => [...acc, cur.y], []); const minX = Math.min(...xArr) + disX; const minY = Math.min(...yArr) + disY; const maxX = Math.max(...xArr) + disX; const maxY = Math.max(...yArr) + disY;
if(minX < 2 || maxX > canvas.width - 2 || minY < 2 || maxY > canvas.height - 2){ return; }
for (let i = 0; i < 6; i++) { const point = points[i]; point.x += disX; point.y += disY; }
paint(); }
|