Canvas2D ellipse() 规范/实现不正确吗?

问题描述 投票:0回答:1

我一直在研究如何仅使用 canvas2d 和椭圆数学来渲染线框透视正确的球体。 这很有趣,但我很快意识到

ellipse()
函数在规范方面有一个非常奇怪的实现。

事实上,

ellipse
函数需要 7(或 8)个参数:

ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle)

startAngle
是这样描述的:

椭圆开始的角度,从正 x 轴顺时针测量并以弧度表示。

给定一个参数

0 <= t <= 2 * PI
,我们可以像这样计算椭圆上关联点的位置:

let dx = radiusX * cos(t)
let dy = radiusY * sin(t)

let px = x + dx * cos(rotation) - dy * sin(rotation)
let py = y + dx * sin(rotation) + dy * cos(rotation)

如果我们使用

startAngle = t
,我们的椭圆将在我们的点开始它的弧线。但。 但是
t
NOT 角度,绝对不是我们点与椭圆 x 轴的角度。显然有些人仍然称之为偏心角,但我的观点仍然成立。

(看这里)

事实上,如果我们尝试使椭圆的弧从特定的angle开始,我们可以看到结果是not我们期望的,除非椭圆是圆(

radiusX = radiusY
)或
startAngle 
PI / 2
的倍数。

这是我提供的交互式演示,您可以看到奇怪的默认行为

我的主张是函数 应该总是 表现得像它在 corrected case with the current specification.

要么那样,要么改变规范来讨论

t
startAngle
的参数
endAngle
,并且 避免 说它们是角度,因为目前它们肯定不是。

有谁知道这个实现/规范是怎么来的,如果之前有人报告过这个,如果没有,在哪里进行这样的讨论? 任何其他见解表示赞赏!

我发现了这个related question但它并不令人满意,因为回复仅显示how来纠正功能,但不讨论规范或实现是否应该更正。

javascript canvas angle ellipse
1个回答
0
投票

是的,这里的规格错了。

感谢您的问题,我确实编辑了

ellipse
方法,以便它使用偏心圆的角度,就像已经完成的所有实现一样。

作为一般规则,当你在规范中发现错误时,三重检查你确定它,然后在规范的 github 项目上打开一个问题(大多数规范链接到文档顶部的 repo,WHATWG 规范也在页面右下角有一个“File an issue about the selected text”链接)。但是,如果您没有信心,也欢迎像您一样在 StackOverflow 上写一个问题,至少可以确认您发现了一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.