Pomax / bezierjs

A nodejs and client-side library for (cubic) Bezier curve work
MIT License
1.74k stars 233 forks source link

Bezier curve through points. #12

Open be5invis opened 9 years ago

be5invis commented 9 years ago

A function constructs quadratic/cubic/poly bezier curve through points given would be useful. Nicer if we can specify tangent direction of start and end points.

Pomax commented 9 years ago

Good point, I forgot I hadn't ported Catmull-Rom to bezier.js yet.

soswow commented 9 years ago

@Pomax just in case this might be useful https://github.com/soswow/fit-curves

Pomax commented 9 years ago

no really need (although thanks for the suggestion): they're already written up in http://pomax.github.io/bezierinfo/#catmullconv, just haven't had time to move them into bezier.js, too. https://github.com/Pomax/bezierjs/tree/gh-pages/test/autodraw makes use of the concept already, but in its own file. We're not working with rational B-splines, but plain Bezier curves, so we can just do a straight up Catmull-Rom fit and then trivially convert so that each segment uses Bezier instead of CR coordinates.

lehni commented 8 years ago

I think you're talking of different types of curve-fitting here: @soswow's link is to a port of Philip J. Schneider's algorithm that tries to put as few curves as possible through a list of points with an allowed maximum error. We have this same algorithm in Paper.js too (with some added tweaks), exposed through Path#simplify(): https://github.com/paperjs/paper.js/blob/develop/src/path/PathFitter.js You can see the code in action here: http://paperjs.org/examples/path-simplification/

The fitting of catmull-rom splines is what we offer under Path#smooth(): It creates a smooth path by adjusting the handles of the curves using different methods (catmull-rom being one of them), but without changing the amounts of segments / curves in a path.

Both approaches are useful in different situations, e.g. curve-fitting can be used to process the point data received from a pointing device.

Pomax commented 8 years ago

my bad, thanks for the correction.

behdad commented 8 years ago

I think you're talking of different types of curve-fitting here: @soswow's link is to a port of Philip J. Schneider's algorithm that tries to put as few curves as possible through a list of points with an allowed maximum error. We have this same algorithm in Paper.js too (with some added tweaks), exposed through Path#simplify(): https://github.com/paperjs/paper.js/blob/develop/src/path/PathFitter.js You can see the code in action here: http://paperjs.org/examples/path-simplification/

Simplifying is in https://github.com/Pomax/bezierjs/issues/26