【发布时间】:2021-05-25 12:03:09
【问题描述】:
如果选中复选框,则圆圈应在画布上书写,如果未选中复选框,则圆圈不应在画布上书写。
如何将此复选框扩展到外部源以控制书写而不是在画布上书写(即来自 Arduino 等的输出)
requestAnimationFrame(animate);
const ctx = canvas1.getContext('2d');
canvas1.width = innerWidth;
canvas1.height = innerHeight;
const bgCan = copyCanvas(canvas1);
const redSize = 10, blueSize = 5; // circle sizes on pixels
const drawSpeed = 2; // when button down draw speed in pixels per frame
var X = 50, Y = 50;
var angle = 0;
var mouseButtonDown = false;
document.addEventListener('mousedown', () => mouseButtonDown = true);
document.addEventListener('mouseup', () => mouseButtonDown = false);
function copyCanvas(canvas) {
const can = Object.assign(document.createElement("canvas"), {
width: canvas.width, height: canvas.height
});
can.ctx = can.getContext("2d");
return can;
}
function circle(ctx){
ctx.fillStyle = 'red';
ctx.beginPath();
ctx.arc(X, Y, redSize, 0, Math.PI*2);
ctx.fill();
}
function direction(ctx){
const d = blueSize + redSize + 5;
ctx.fillStyle = 'blue';
ctx.beginPath();
ctx.arc(d * Math.sin(angle) + X, d * Math.cos(angle) + Y, blueSize, 0, Math.PI*2);
ctx.fill();
}
function animate(){
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.drawImage(bgCan, 0, 0);
if (mouseButtonDown) {
circle(bgCan.ctx);
X += Math.sin(angle) * drawSpeed;
Y += Math.cos(angle) * drawSpeed;
} else {
angle += 0.1;
circle(ctx);
}
direction(ctx);
requestAnimationFrame(animate);
}
#canvas1{
position: absolute;
top:0;
left: 0;
width: 100%;
height: 100%;
}
<canvas id="canvas1"></canvas>
【问题讨论】:
-
您的代码中没有复选框...
-
您的复选框真/假条件似乎并没有太大变化,我原以为。你总是想画红色圆圈,你总是想画蓝色圆圈。复选框的作用是控制您是否还想在一组点之间画一条粗线。每个鼠标交互都可以添加一个新点。如果选中该框,则绘制这条粗路径,然后绘制每个圆圈。 (假设蓝色不应该被这条粗路径隐藏,而是应该出现在它的前面)如果没有选中该框,请不要担心粗线。
标签: javascript html css canvas