如何在画布内放置多个旋转矩形(Javascript)



如前所述,我正试图在画布内放置一整圈矩形,但如图所示,我只能显示该圆圈的四分之一。我用canvas元素制作了一个基本的html文档。相对于画布元素的大小,我制作了一个矩形,并将其置于画布的中间。有了这个,我试着做一个for循环,它应该在做一个完整的圆圈的同时旋转矩形。但它没有起作用。

body{
background-color: #000000;
}
canvas {
padding: 0;
margin: auto;
display: block;
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background-color: white;
border:1px solid
}
<html>
<body>
<link rel="stylesheet" href="canvas.css">
<canvas id="myCanvas" width="900" height="900" ></canvas>

<script>
// Get id from canvas element
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");

// Change size of rectangle
var recWidth = 40
var recHeight = 40

// Position rectangle in the middle of the canvas    
var xPos = (document.getElementById("myCanvas").width/2) - (recWidth/2);   
var yPos = (document.getElementById("myCanvas").height/2) - (recHeight/2);

// Convert degree to radian
const degToRad = (degrees) => {
return degrees / 180 * Math.PI;
}    

// Number of rectangles
const num = 36;
for (let i = 0; i<num; i++){
const slice = degToRad (360 / num);
const angle = slice * i; 
context.fillStyle = 'green';
context.save();
context.rotate (angle);            
context.beginPath();
context.rect(xPos,yPos,recWidth,recHeight);
context.fill();
context.restore();
}
</script> 

</body>
</html>

我希望创建单独的答案不会违反SO协议,但我这样做是为了避免新代码出现混乱。

这是您的代码的清理版本
说明:
将旋转中心移动到画布的中心:
context.translate(宽/2,高/2(
然后将绘图半径指定为画布尺寸的四分之一
rad=xPos/2
一次旋转一个切片,使其保持原位(无保存/恢复(
(删除不正确的语句(

<script>
// Get id from canvas element
var canvas = document.getElementById("myCanvas");
var context = canvas.getContext("2d");
context.font = "14pt Arial";
context.fillStyle = "green";
// Change size of rectangle
var recWidth = 30
var recHeight = 30
// Position rectangle in the middle of the canvas    

var canvW = document.getElementById("myCanvas").width;
var canvH = document.getElementById("myCanvas").height;
var xPos = canvW/2;
var yPos = canvH/2;
var rad = xPos/2;  // radius = 1/4 of canvas dimensions
context.translate(xPos,yPos);  // rotate around the center
// Convert degree to radian
const degToRad = (degrees) => {
return degrees / 180 * Math.PI;
}    
// Number of rectangles
const num = 36;
const slice = degToRad (360 / num);
const angle = slice; 
// animates the drawing to help see what is going on
// by introducing 1/2 second delay between individual draws
function draw1Rect(i)
{
i++;
if (i < num) setTimeout("draw1Rect("+i+")", 500);
context.rotate (angle);            
context.fillRect(rad,rad,recWidth,recHeight);
context.fillText(i, rad-30, rad-30);
}
draw1Rect(0);
</script> 

问题是,大多数正方形都是在画布边界之外绘制的。

画布似乎围绕(0,0(旋转,而不是围绕中心旋转。

环路外:

// Use a different center and a smaller radius
var xPos = (document.getElementById("myCanvas").width/4) - (recWidth/4);   
var yPos = (document.getElementById("myCanvas").height/4) - (recHeight/4);
// Move the center 
context.translate(xPos * 2, yPos * 9/4);
context.font = "14pt Arial";

环路内部:

context.fill(); // existing line of code
context.fillText(i, xPos-30, yPos-30); // added
context.restore(); // existing

另外:您可以使用context.fillRect((.来代替context.beginPath((、context.rerect((和context.fill((

最新更新