javascript - 如何准确指定我需要填写 HTML Canvas 的内容?
问题描述
在我的应用程序中,我使用 HTML Canvas 创建了一个画布,我希望能够单击页面以绘制一个填充有颜色的圆圈,单击页面的另一部分并让圆圈自动与一条线连接。
我几乎让它工作了,但是当我尝试填充我的圆圈时,它也会填充圆圈之间的空间。
这是我尝试使用时的样子ctx.fill()
:
let hasCircle = false;
document.addEventListener('click', onMouseMove);
const c = document.getElementById("canvas");
const ctx = c.getContext("2d");
// Create a circle on page click
document.getElementById('canvas').onclick = function(event) {
ctx.arc(event.clientX - 10, event.clientY - 10, 4, 0, 2 * Math.PI);
ctx.fill()
if (!hasCircle) {
hasCircle = true;
}
}
// Connect circles with a line
function onMouseMove(event) {
if (hasCircle) {
ctx.lineTo(event.clientX - 10, event.clientY - 10);
ctx.stroke();
}
}
function reset() {
hasCircle = false;
}
#canvas {
border: 1px solid black;
}
<canvas id="canvas"></canvas>
有没有办法准确地指定我想用颜色填充什么?
解决方案
您将有一个更好的时间拥有一个单独的功能,该功能可以根据您的状态(即您拥有的点)完全重绘画布。
const c = document.getElementById("canvas");
const ctx = c.getContext("2d");
const points = [];
function redraw() {
c.width = c.width; // clear canvas
if (!points.length) return;
// Fill points one by one
ctx.fillStyle = "rgba(255, 0, 0, 0.5)";
points.forEach(([x, y]) => {
ctx.beginPath();
ctx.arc(x, y, 4, 0, 2 * Math.PI);
ctx.fill();
});
// Begin new path for polygon
ctx.beginPath();
points.forEach(([x, y], i) => {
if (i == 0) ctx.moveTo(x, y);
else ctx.lineTo(x, y);
});
ctx.lineTo(points[0][0], points[0][1]);
ctx.stroke();
}
document.getElementById("canvas").addEventListener("click", (event) => {
points.push([event.clientX - 10, event.clientY - 10]);
redraw();
});
#canvas {
border: 1px solid black;
}
<canvas id="canvas"></canvas>
推荐阅读
- python - 我怎样才能用乌龟代替钢笔?
- api - Soundcloud API - 获取公共音轨的流 URL
- angular - 我如何编辑重用(可重用)组件的内容或样式而不改变另一个角度
- java - 类型 GUI 中的方法 countTrue(boolean[]) 不适用于参数 (boolean, boolean, boolean, boolean, boolean)
- python - request.POST 数据字段没有到达表格的cleaned_data
- python - 在给定条件 Python 的情况下,熊猫用来自另一个数据帧的信息填充数据帧一列的空白空间
- python-3.x - voronoi 镶嵌的 Delaunay 三角剖分
- html - 是否可以创建一个多行?
- postgresql - postgresql 从同一个表中选择行两次
- reactjs - 类型错误:无法读取未定义的属性(读取“目标”)