我的第一种方法是使用 绘制四个弧线arcTo()
,我错误地认为这是通用的解决方法 =) 这是代码
var drawArcWith4ArcTo = function (context) {
context.setTransform(1, -k, 0, scaleY, pushBy.x, pushBy.y)
context.beginPath()
context.moveTo(-radius, 0)
context.lineTo(-radius, 0)
context.arcTo(-radius, radius, 0, radius, radius)
context.arcTo(radius, radius, radius, 0, radius)
context.arcTo(radius, -radius, 0, -radius, radius)
context.arcTo(-radius, -radius, -radius, 0, radius)
context.stroke()
}
但它在 Opera 中不起作用,原因有两个:
- Opera
arcTo()
需要稍微不同的点作为参数 =)
- 它仍然没有将变换矩阵应用于结果路径。
所以我被迫使用一种解决方法,使用 4 条贝塞尔曲线画一个圆:
var drawArcWith4BezierCurves = function () {
var kappa = 4 * (Math.sqrt(2) - 1) / 3
return function (context) {
context.setTransform(1, -k, 0, scaleY, pushBy.x, pushBy.y)
context.beginPath()
context.moveTo(-radius, 0)
context.bezierCurveTo(
-radius, radius * kappa,
-radius * kappa, radius,
0, radius
)
context.bezierCurveTo(
radius * kappa, radius,
radius, radius * kappa,
radius, 0
)
context.bezierCurveTo(
radius, -radius * kappa,
radius * kappa, -radius,
0, -radius
)
context.bezierCurveTo(
-radius * kappa, -radius,
-radius, -radius * kappa,
-radius, 0
)
context.stroke()
}
}
if (Prototype.Browser.Opera)
drawArc = drawArcWith4BezierCurves()
两个注意事项:
- 结果路径是一个近似值,而不是一个绝对圆(怀疑你是否会注意到这个=)
- 该示例使用了一些 Prototype.js,但很容易猜到我的意思。