Skip to content

Instantly share code, notes, and snippets.

@steveruizok
Created May 6, 2021 20:25
Show Gist options
  • Save steveruizok/16804e7d06bb5108c7f3b756e9003b15 to your computer and use it in GitHub Desktop.
Save steveruizok/16804e7d06bb5108c7f3b756e9003b15 to your computer and use it in GitHub Desktop.
Length of a cubic bezier curve
function pointOnBezierCurve(
start: number[],
cp1: number[],
cp2: number[],
end: number[],
t: number
) {
let [ax, ay] = start
let [bx, by] = cp1
let [cx, cy] = cp2
let [dx, dy] = end
ax += (bx - ax) * t
bx += (cx - bx) * t
cx += (dx - cx) * t
ax += (bx - ax) * t
bx += (cx - bx) * t
ay += (by - ay) * t
by += (cy - by) * t
cy += (dy - cy) * t
ay += (by - ay) * t
by += (cy - by) * t
return vec.add([ax, ay], vec.mul(vec.sub([bx, by], [ax, ay]), t))
}
function getBezierCurveLength(
start: number[],
cp1: number[],
cp2: number[],
end: number[],
ptCount = 40
) {
let totDist = 0
let prev = start
for (var i = 1; i < ptCount; i++) {
var pt = pointOnBezierCurve(start, cp1, cp2, end, i / ptCount)
totDist += vec.dist(pt, prev)
prev = pt
}
totDist += vec.dist(prev, end)
return totDist
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment