写js代码,鼠标画点连线,结束画点功能,鼠标点击选中点拖拽
时间: 2024-05-08 18:19:53 浏览: 14
您这个问题属于图形编辑领域的应用,需要设计一些基本的绘图组件和操作交互逻辑。下面给您提供一个基于HTML5 Canvas绘图的简单实现方案:
```HTML
<body>
<canvas id="myCanvas" width="500" height="500"></canvas>
<script>
let canvas = document.getElementById("myCanvas");
let ctx = canvas.getContext("2d");
let nodes = [];
let lines = [];
let curNode = null; // 当前选中的节点
// 添加节点,事件处理函数
function handleAddNode(e) {
let rect = canvas.getBoundingClientRect();
let x = e.clientX - rect.left;
let y = e.clientY - rect.top;
nodes.push({x: x, y: y});
drawNodes();
}
// 绘制所有节点
function drawNodes() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
// 绘制所有连线
lines.forEach(line => {
ctx.beginPath();
ctx.moveTo(nodes[line[0]].x, nodes[line[0]].y);
ctx.lineTo(nodes[line[1]].x, nodes[line[1]].y);
ctx.stroke();
});
// 绘制所有节点
nodes.forEach(node => {
ctx.beginPath();
ctx.arc(node.x, node.y, 10, 0, Math.PI*2);
ctx.fill();
});
}
// 选中节点,事件处理函数
function handleSelectNode(e) {
let rect = canvas.getBoundingClientRect();
let x = e.clientX - rect.left;
let y = e.clientY - rect.top;
// 找到距离点击位置最近的节点
let minDist = Number.MAX_VALUE;
for (let i = 0; i < nodes.length; i++) {
let dist = Math.sqrt((nodes[i].x - x)**2 + (nodes[i].y - y)**2);
if (dist < 10 && dist < minDist) {
minDist = dist;
curNode = i;
}
}
}
// 移动节点,事件处理函数
function handleMoveNode(e) {
if (curNode !== null) {
let rect = canvas.getBoundingClientRect();
nodes[curNode].x = e.clientX - rect.left;
nodes[curNode].y = e.clientY - rect.top;
drawNodes();
}
}
// 添加连线,事件处理函数
function handleAddLine(e) {
if (curNode !== null) {
// 找到距离鼠标位置最近的节点
let rect = canvas.getBoundingClientRect();
let x = e.clientX - rect.left;
let y = e.clientY - rect.top;
let minDist = Number.MAX_VALUE;
let nearNode = null;
for (let i = 0; i < nodes.length; i++) {
let dist = Math.sqrt((nodes[i].x - x)**2 + (nodes[i].y - y)**2);
if (dist < 10 && i !== curNode && dist < minDist) {
minDist = dist;
nearNode = i;
}
}
if (nearNode !== null) {
lines.push([curNode, nearNode]);
drawNodes();
}
}
}
// 添加鼠标事件监听
canvas.addEventListener("mousedown", handleSelectNode);
canvas.addEventListener("mousemove", handleMoveNode);
canvas.addEventListener("mouseup", e => curNode = null);
canvas.addEventListener("dblclick", handleAddNode);
canvas.addEventListener("click", handleAddLine);
</script>
</body>
```
这段代码实现了鼠标画点连线、结束画点功能,以及鼠标点击选中点拖拽的交互逻辑。具体实现细节可以参考注释和Canvas API文档。