如何在画布中旋转圆弧扇区(如圆心)?

时间:2017-12-16 16:28:24

标签: javascript html canvas

如何在其轴心(圆心)上旋转圆扇形(或扇形)?

<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;"></canvas>

<script>
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    ctx.rotate(60 * Math.PI / 180); // wrong rotation
    ctx.beginPath();
    ctx.arc(100, 75, 50, 0, (1/12) * 2 * Math.PI);
    ctx.lineTo(100, 75);
    ctx.closePath();
    ctx.fill();
</script> 

enter image description here

1 个答案:

答案 0 :(得分:3)

希望这会有所帮助。

旋转绘制的对象可以使用arc本身作为其第四个参数。这个link也可以为您提供帮助。

var canvas = document.getElementById("myCanvas");
var ctx = canvas.getContext("2d");

var startAngle = 0;
var rotatedAngle = 60;

function degtorat (deg){
  return deg * Math.PI/180;
}

// degtorat2 looks odd in the first glance but it is not because PI
// is also used as counter variable with deg no matter whether is's 
// put after the division
// -> (deg * PI) / 180 as in degtorat   
function degtorat2 (deg){
  return deg / 180 * Math.PI;
}

setInterval(function(){

  ctx.beginPath();
  // ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
  // endangle must also be increased by the same amount of startAngle
  ctx.arc(100, 75, 50, degtorat(startAngle), degtorat(startAngle)+(1/12) * 2 * Math.PI);
  ctx.lineTo(100,75);
  ctx.closePath();
  ctx.fill();

  // increase angle at 60 degrees  
  startAngle += rotatedAngle;

},1000);
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;"></canvas>

按要求对这些操作进行简短说明degtorat(startAngle)+(1/12) * 2 * Math.PI,一步一步:

整个等式返回以弧度绘制三角形的endAngle。

让我们把它分开:

  1. degtorat(startAngle)

    我们想要在顺时针方向从某个startAngle开始绘制一个三角形,因此我们也必须从这个角度开始。但这还不够,因为三角形也应该有一定的尺寸。所以这里(1/12) * 2 * Math.PI开始发挥作用。

    Spoiler:degtorat转换(主要由人类使用)度数到弧度(总是由HTML5画布上下文操作使用)。 (我刚刚添加了degtorat degtorat2来证明无论PI在分割之前还是之后相乘,都会返回正确的弧度。)

  2. (1/12) * 2 * Math.PI

    必须将这些操作添加到degtorat(startAngle),因为三角形应具有一定的大小。要计算此尺寸,我们使用这些操作(1/12) * 2 * Math.PI

    2 * Math.PI以弧度表示整个圆圈。一个圆可以包含12个三角形,每个三角形的大小为30度,但我们只能绘制6个三角形,因为我们将30度空白。这就是为什么我们必须将整个圆除以12((1/12),6个可见三角形,6个空白三角形)。

    但我们想要将可见三角形旋转60度。因此,在绘制出填满整个圆圈30度的第一个可见三角形之后,我们将startAngle增加60度,以便在第一个startAngle之后开始绘制下一个三角形60度,并留下30度空白