The CanvasRenderingContext2D
.arcTo()
method of the Canvas 2D API adds a circular arc to the current sub-path, using the given control points and radius. The arc is automatically connected to the path's latest point with a straight line, if necessary for the specified parameters.
This method is commonly used for making rounded corners.
Note: Be aware that you may get unexpected results when using a relatively large radius: the arc's connecting line will go in whatever direction it must to meet the specified radius.
void ctx.arcTo(x1, y1, x2, y2, radius);
x1
y1
x2
y2
radius
One way to think about arcTo()
is to imagine two straight segments: one from the starting point to a first control point, and another from there to a second control point. Without arcTo()
, these two segments would form a sharp corner: arcTo()
creates a circular arc that fits this corner and smooths is out. In other words, the arc is tangential to both segments.
<canvas id="canvas"></canvas>
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); // Tangential lines ctx.beginPath(); ctx.strokeStyle = 'gray'; ctx.moveTo(200, 20); ctx.lineTo(200, 130); ctx.lineTo(50, 20); ctx.stroke(); // Arc ctx.beginPath(); ctx.strokeStyle = 'black'; ctx.lineWidth = 5; ctx.moveTo(200, 20); ctx.arcTo(200,130, 50,20, 40); ctx.stroke(); // Start point ctx.beginPath(); ctx.fillStyle = 'blue'; ctx.arc(200, 20, 5, 0, 2 * Math.PI); ctx.fill(); // Control points ctx.beginPath(); ctx.fillStyle = 'red'; ctx.arc(200, 130, 5, 0, 2 * Math.PI); // Control point one ctx.arc(50, 20, 5, 0, 2 * Math.PI); // Control point two ctx.fill();
In this example, the path created by arcTo()
is thick and black. Tangent lines are gray, control points are red, and the start point is blue.
This example creates a rounded corner using arcTo()
. This is one of the method's most common uses.
<canvas id="canvas"></canvas>
The arc begins at the point specified by moveTo()
: (230, 20). It is shaped to fit control points at (90, 130) and (20, 20), and has a radius of 50. The lineTo()
method connects the arc to (20, 20) with a straight line. Note that the arc's second control point and the point specified by lineTo()
are the same, which produces a totally smooth corner.
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(230, 20); ctx.arcTo(90,130, 20,20, 50); ctx.lineTo(20, 20); ctx.stroke();
If you use a relatively large radius, the arc may appear in a place you didn't expect. In this example, the arc's connecting line goes above, instead of below, the coordinate specified by moveTo()
. This happens because the radius is too large for the arc to fit entirely below the starting point.
<canvas id="canvas"></canvas>
const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); ctx.beginPath(); ctx.moveTo(180, 90); ctx.arcTo(180,130, 110,130, 130); ctx.lineTo(110, 130); ctx.stroke();
Specification | Status | Comment |
---|---|---|
HTML Living Standard The definition of 'CanvasRenderingContext2D.arcTo' in that specification. | Living Standard |
Desktop | ||||||
---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
Basic support | Yes | 12 | Yes | Yes | Yes | Yes |
Mobile | |||||||
---|---|---|---|---|---|---|---|
Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
Basic support | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
CanvasRenderingContext2D
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/arcTo