javascript - HTML5 Canvas : counterclockwise arc with angle > 2 PI

标签 javascript html canvas

我试图弄清楚为什么 Angular > 2 PI 在顺时针和逆时针绘制圆弧时不会给出相同的结果。

看这个代码片段,在第一行我“顺时针”画了 3 个红色圆弧,起始 Angular 为 0,结束 Angular 为 PI,2*PI 和 3*PI。 然后我用相同的参数“逆时针”绘制 3 个蓝色圆弧。

第三个结果让我感到困惑......谁能给我解释一下?

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

// CLOCKWISE, angle = PI
ctx.beginPath();
ctx.arc(50, 50, 40, 0, Math.PI, false);
ctx.closePath();
ctx.stroke();
ctx.fillStyle = "red";
ctx.fill();

// CLOCKWISE, angle = 2 PI
ctx.beginPath();
ctx.arc(150, 50, 40, 0, 2 * Math.PI, false);
ctx.closePath();
ctx.stroke();
ctx.fillStyle = "red";
ctx.fill();

// CLOCKWISE, angle = 3 PI
ctx.beginPath();
ctx.arc(250, 50, 40, 0, 3 * Math.PI, false);
ctx.closePath();
ctx.stroke();
ctx.fillStyle = "red";
ctx.fill();

// COUNTERCLOCKWISE, angle = PI
ctx.beginPath();
ctx.arc(50, 150, 40, 0, Math.PI, true);
ctx.closePath();
ctx.stroke();
ctx.fillStyle = "blue";
ctx.fill();

// COUNTERCLOCKWISE, angle = 2 PI
ctx.beginPath();
ctx.arc(150, 150, 40, 0, 2 * Math.PI, true);
ctx.closePath();
ctx.stroke();
ctx.fillStyle = "blue";
ctx.fill();

// COUNTERCLOCKWISE, angle = 3 PI
ctx.beginPath();
ctx.arc(250, 150, 40, 0, 3 * Math.PI, true);
ctx.closePath();
ctx.stroke();
ctx.fillStyle = "blue";
ctx.fill();
<canvas id="myCanvas" width="350" height="250" style="border:1px solid #d3d3d3;"/>

最佳答案

根据to specs :

If anticlockwise is false and endAngle-startAngle is equal to or greater than 2π, or, if anticlockwise is true and startAngle-endAngle is equal to or greater than 2π, then the arc is the whole circumference of this ellipse, and the point at startAngle along this circle's circumference, measured in radians clockwise from the ellipse's semi-major axis, acts as both the start point and the end point.

Otherwise, the points at startAngle and endAngle along this circle's circumference, measured in radians clockwise from the ellipse's semi-major axis, are the start and end points respectively, and the arc is the path along the circumference of this ellipse from the start point to the end point, going anti-clockwise if anticlockwise is true, and clockwise otherwise. Since the points are on the ellipse, as opposed to being simply angles from zero, the arc can never cover an angle greater than 2π radians.

放入可能更清晰的伪代码:

if(
  (anticlockwise === false && (endAngle - startAngle) >= 2π) ||
  (anticlockwise === true  && (startAngle - endAngle) >= 2π)
  ) {
  arc_circumference = 2π;
}
else {
  startAngle = startAngle % 2π;
  endAngle = endAngle % 2π;
}

在您的情况下,startAngle = 0endAngle = 3πanticlowkwise = true,如果我们运行上述算法,我们最终在其他情况下 (0 - 3π < 2π)endAngle 现在是 (3π % 2π = 1π)

通过交换 startAngleendAngle 我们可以在没有逆时针标志的情况下获得相同的输出:

var ctx = canvas.getContext("2d");
// COUNTERCLOCKWISE, angle = -3 PI (from OP)
ctx.beginPath();
ctx.arc(50, 150, 40, 0, 3 * Math.PI, true);
ctx.stroke();
ctx.fillStyle = "blue";
ctx.fill();

// CLOCKWISE, angle = -3 PI
ctx.beginPath();
ctx.arc(50, 50, 40, 3 * Math.PI, 0);
ctx.stroke();
ctx.fillStyle = "red";
ctx.fill();
<canvas id="canvas"></canvas>

关于javascript - HTML5 Canvas : counterclockwise arc with angle > 2 PI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52833071/

相关文章:

javascript - 调试 Google 可视化图表 - 回调被多次调用

html - 列出用于下拉菜单的元素 : fails on Safari

java - Thymeleaf:如何打印从数据库中获取的值到html文本中?

javascript - 我如何确定我点击了哪个框?

javascript - CreateJS 缓存对象 - 对象现在不会在舞台上设置动画

javascript - Node.js Mongoose 的麻烦

javascript - 从命令行读取参数 - 错误 TS2304 : Cannot find name 'process'

javascript - 展开和折叠 Accordion 时,图标不会相应地切换

html - 不能将单选按钮垂直放置在中间

javascript - javascript中的圆形动画,greensock tweenlite