round-corner
v1.0.2
Published
Round the corner of two line segments with an arc.
Maintainers
Readme
Round Corners
Take two line segments and round the corner where they meet with an arc. This function is built to be un-opinionated about its end use and can be applied to Canvas 2d, SVG, D3, or whatever applications.

Example
var roundCorners = require('round-corners')
var line = [
[250, 1000],
[400, 100],
[750, 700]
]
var inset = 500
var sequence = roundCorners(line, inset)
// sequence === [segmentA, arc, segmentC]The result
The resulting sequence using ES6 destructuring notation takes the form:
var [segmentA, arc, segmentB] = roundCorners(line, inset)Or explicitly it looks like:
[
[
[250, 1000],
[317.8, 593.1]
],
{
center: [495.9, 622.8],
radius: 180.5,
start: 3.3,
end: 5.7
},
[
[651.9, 531.8],
[750, 700]
]
]Example Usage
2d Canvas
This format lends itself to 2d canvas rendering. Here is an example of how to render the result.
function drawCanvas2dArc (ctx, sequence) {
var segmentA = sequence[0]
var arc = sequence[1]
var segmentB = sequence[2]
ctx.beginPath()
ctx.moveTo(segmentA[0][0], segmentA[0][1])
ctx.lineTo(segmentA[1][0], segmentA[1][1])
ctx.arc(arc.center[0], arc.center[1], arc.radius, arc.start, arc.end)
ctx.moveTo(segmentB[0][0], segmentB[0][1])
ctx.lineTo(segmentB[1][0], segmentB[1][1])
ctx.lineWidth = 4
ctx.strokeStyle = '#fff'
ctx.stroke()
}See this RequireBin for a live example.
SVG
It can also be used with SVG with a few extra utility functions.
// Run this function to calculate the "d" attribute for a path.
function generateArcPath (sequence) {
var segmentA = sequence[0]
var arc = sequence[1]
var segmentB = sequence[2]
return [
drawLine(segmentA),
drawArc(segmentA, arc, segmentB),
drawLine(segmentB)
].join(' ')
}
function drawLine (segment) {
return 'M' + segment[0][0] + ',' + segment[0][1] + ' ' +
'L' + segment[1][0] + ',' + segment[1][1]
}
function drawArc (segmentA, arc, segmentB) {
// We need to compute the rotation of the arc to match the needed SVG format.
var rotation = toDegrees(Math.atan2(
segmentB[0][1] - segmentA[1][1],
segmentB[0][0] - segmentA[1][0]
))
return [
'A', arc.radius, arc.radius, rotation, 0, 1, segmentB[0][0], segmentB[0][1]
].join(' ')
}
function toDegrees (radians) {
return radians / Math.PI * 180
}See this RequireBin for a live example.
Running the examples
- Clone the repo, or navigate to the
./node_modules/round-cornerfolder of the currently installed location. - From the command line run
npm install - SVG example: run
npm run example:svg - Canvas example: run
npm run example:canvas
