gpt4 book ai didi

javascript - html5 Canvas 和 javascript 的奇怪行为

转载 作者:可可西里 更新时间:2023-11-01 14:49:39 25 4
gpt4 key购买 nike

我制作了一些 Canvas ,我在上面画了一个圆圈和许多其他形状。我制作了一个 _rotate() 函数,该函数旨在清除(删除内容) Canvas 并调用一个绘制正方形的函数。问题是点击旋转后,不仅绘制了正方形,还绘制了圆形和矩形。我不知道代码可能有什么问题,所以我正在接受任何建议。实际代码:

var c = document.getElementById("canv");
var canvas = c.getContext("2d");
//ciarka
function _rotate() {

canvas.clearRect(0, 0, 600, 400);
stvorec(Math.random());
return;
}


function stvorec(param) {
canvas.rotate(param*Math.PI/180);
canvas.fillStyle="green";
canvas.fillRect(350,50,50,50);
canvas.stroke();
}

function ciarka() {
canvas.beginPath();
canvas.moveTo(10,10);
canvas.lineTo(50,30);
canvas.lineTo(100,10);
canvas.lineTo(150,30);
canvas.lineTo(200,10);
canvas.lineTo(250,30);
canvas.lineTo(300,10);
canvas.lineTo(350,30);
canvas.lineTo(400,10);
canvas.lineTo(450,30);
canvas.lineTo(500,10);
canvas.lineTo(550,30);
canvas.lineTo(590,10);
canvas.stroke();
}


//obdlznik
function obdlznik() {
canvas.rect(150,150,100,50);
canvas.strokeStyle="black";
canvas.stroke();
}

//kruh
function kruh() {
canvas.beginPath();
canvas.arc(200,80,50,0,2.0*Math.PI);
canvas.stroke();
}
//stvorec

stvorec();
ciarka();
kruh();
obdlznik();

$("body").on("click", "#rot", function() {
_rotate();
});

Jsfiddle 供引用:jsfiddle

最佳答案

我发现您的代码中存在一些问题:

  • 为每个笔划/填充执行 beginPath()。
  • 对圆弧执行 closePath() 以使其成为圆形而不是 360 度圆弧。
  • 确保在执行 .rotate 之前使用 .translate 设置旋转点
  • stvorec(Math.random()) 仅产生 0-1 度的 Angular 。

不是故障,只是命名奇怪:您将上下文变量命名为 canvas。上下文变量通常称为 contextctx

我不知道您的设计要求,但这里有一些重构的工作代码:

http://jsfiddle.net/m1erickson/5PuW9/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<style>
body{ background-color: ivory; }
canvas{border:1px solid red;}
</style>
<script>
$(function(){

var c = document.getElementById("canv");
var canvas = c.getContext("2d");

//ciarka
function _rotate() {
canvas.clearRect(0, 0, 600, 400);
stvorec(Math.random()*360);
}

function stvorec(param) {
canvas.save();
canvas.beginPath();
canvas.translate(350,50);
canvas.rotate(param*Math.PI/180);
canvas.fillStyle="green";
canvas.fillRect(-25,-25,50,50);
canvas.restore();
}

function ciarka() {
canvas.beginPath();
canvas.moveTo(10,10);
canvas.lineTo(50,30);
canvas.lineTo(100,10);
canvas.lineTo(150,30);
canvas.lineTo(200,10);
canvas.lineTo(250,30);
canvas.lineTo(300,10);
canvas.lineTo(350,30);
canvas.lineTo(400,10);
canvas.lineTo(450,30);
canvas.lineTo(500,10);
canvas.lineTo(550,30);
canvas.lineTo(590,10);
canvas.stroke();
}

//obdlznik
function obdlznik() {
canvas.beginPath();
canvas.rect(150,150,100,50);
canvas.strokeStyle="black";
canvas.stroke();
}

//kruh
function kruh() {
canvas.beginPath();
canvas.arc(200,80,50,0,2.0*Math.PI);
canvas.closePath();
canvas.stroke();
}

//stvorec
stvorec();
ciarka();
kruh();
obdlznik();

$("#test").click(function() {
_rotate();
});

}); // end $(function(){});
</script>
</head>
<body>
<button id="test">Test</button><br>
<canvas id="canv" width=600 height=400></canvas>
</body>
</html>

[增加beginPath和负坐标的解释]

关于 context.beginPath()

将 beginPath() 和 fill()/stroke() 视为上下文路径绘制命令周围所需的括号。

如果您不对每组新的路径绘制命令执行 beginPath,则在调用下一个 fill()/stroke() 时将重新执行所有先前的路径绘制命令。

例如:

// circle#1

context.beginPath();
context.arc(100,100,10,0,Math.PI*2);
context.closePath();
context.fillStyle=”green”;
context.fill();

// circle#2 -- Note: no beginPath here

context.arc(200,200,10,0,Math.PI*2);
context.closePath();
context.fillStyle=”green”;
context.fill();

在这个例子中,圆#1 将被绘制。但是由于 circle#2 的代码中没有 beginPath,circle#1 将与 circle#2 一起重绘

两个圆圈都是绿色的,因为每个 beginPath 只允许使用 1 个样式(将使用最后一个 fillStyle=”green”,不会使用红色样式)。

关于旋转和负坐标

要旋转,您应该告诉上下文您要围绕哪个坐标点旋转。

这叫做设置旋转点。默认情况下,上下文会将旋转点设置在 Canvas 的左上角,因此每个后续绘图都将围绕 Canvas 的左上角旋转。

要设置您自己的旋转点,您可以执行 context.translate(myCenterX,myCenterY)。

然后所有后续的绘制将围绕 myCenterX,myCenterY。

把这想象成在一张纸上拿着铅 Nib 。纸绕着铅 Nib 旋转。

现在绘制矩形。

由于上下文从矩形的左上角绘制矩形,因此矩形将围绕其自身的左上角旋转。

要绕矩形中心旋转,必须使用负坐标将矩形向左和向上拉动,直到矩形以旋转点为中心。

这意味着您必须 fillRect( -rectWidth/2, -rectHeight/2 ) 使矩形在旋转点上居中。

关于javascript - html5 Canvas 和 javascript 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22235110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com