Preface
++ In order to draw things in 2D, we usually rely on lines, which typically get classified into two categories: straight lines, and curves. The + first of these are as easy to draw as they are easy to make a computer draw. Give a computer the first and last point in the line, and BAM! + straight line. No questions asked. +
++ Curves, however, are a much bigger problem. While we can draw curves with ridiculous ease freehand, computers are a bit handicapped in that + they can't draw curves unless there is a mathematical function that describes how it should be drawn. In fact, they even need this for + straight lines, but the function is ridiculously easy, so we tend to ignore that as far as computers are concerned; all lines are + "functions", regardless of whether they're straight or curves. However, that does mean that we need to come up with fast-to-compute + functions that lead to nice looking curves on a computer. There are a number of these, and in this article we'll focus on a particular + function that has received quite a bit of attention and is used in pretty much anything that can draw curves: Bézier curves. +
++ They're named after Pierre Bézier, who is principally responsible for making + them known to the world as a curve well-suited for design work (publishing his investigations in 1962 while working for Renault), although + he was not the first, or only one, to "invent" these type of curves. One might be tempted to say that the mathematician + Paul de Casteljau was first, as he began investigating the nature of these + curves in 1959 while working at Citroën, and came up with a really elegant way of figuring out how to draw them. However, de Casteljau did + not publish his work, making the question "who was first" hard to answer in any absolute sense. Or is it? Bézier curves are, at their core, + "Bernstein polynomials", a family of mathematical functions investigated by + Sergei Natanovich Bernstein, whose publications on them date back at + least as far as 1912. +
++ Anyway, that's mostly trivia, what you are more likely to care about is that these curves are handy: you can link up multiple Bézier curves + so that the combination looks like a single curve. If you've ever drawn Photoshop "paths" or worked with vector drawing programs like Flash, + Illustrator or Inkscape, those curves you've been drawing are Bézier curves. +
++ But what if you need to program them yourself? What are the pitfalls? How do you draw them? What are the bounding boxes, how do you + determine intersections, how can you extrude a curve, in short: how do you do everything that you might want to do with these curves? That's + what this page is for. Prepare to be mathed! +
+Virtually all Bézier graphics are interactive.
++ This page uses interactive examples, relying heavily on Bezier.js, as well as maths + formulae which are typeset into SVG using the XeLaTeX typesetting system and + pdf2svg by David Barton. +
+This book is open source.
++ This book is an open source software project, and lives on two github repositories. The first is + https://github.com/pomax/bezierinfo and is the purely-for-presentation version you are + viewing right now. The other repository is https://github.com/pomax/BezierInfo-2, + which is the development version, housing all the code that gets turned into the web version, and is also where you should file + issues if you find bugs or have ideas on what to change or add to the primer. +
+How complicated is the maths going to be?
++ Most of the mathematics in this Primer are early high school maths. If you understand basic arithmetic, and you know how to read English, + you should be able to get by just fine. There will at times be far more complicated maths, but if you don't feel like digesting + them, you can safely skip over them by either skipping over the "detail boxes" in section or by just jumping to the end of a section with + maths that looks too involving. The end of sections typically simply list the conclusions so you can just work with those values directly. +
+What language is all this example code in?
++ There are way too many programming languages to favour one of all others, soo all the example code in this Primer uses a form of + pseudo-code that uses a syntax that's close enough to, but not actually, modern scripting languages like JS, Python, etc. That means you + won't be able to copy-paste any of it without giving it any thought, but that's intentional: if you're reading this primer, presumably you + want to learn, and you don't learn by copy-pasting. You learn by doing things yourself, making mistakes, and then fixing + those mistakes. Now, of course, I didn't intentionally add errors in the example code just to trick you into making mistakes (that would + be horrible!) but I did intentionally keep the code from favouring one programming language over another. Don't worry though, if + you know even a single procedural programming language, you should be able to read the examples without any difficulties. +
+Questions, comments:
++ If you have suggestions for new sections, hit up the Github issue tracker (also + reachable from the repo linked to in the upper right). If you have questions about the material, there's currently no comment section + while I'm doing the rewrite, but you can use the issue tracker for that as well. Once the rewrite is done, I'll add a general comment + section back in, and maybe a more topical "select this section of text and hit the 'question' button to ask a question about it" system. + We'll see. +
+Help support the book!
++ If you enjoyed this book, or you simply found it useful for something you were trying to get done, and you were wondering how to let me + know you appreciated this book, you have two options: you can either head on over to the + Patreon page for this book, or if you prefer to make a one-time donation, head on over to + the buy Pomax a coffee page. This + work has grown from a small primer to a 100-plus print-page-equivalent reader on the subject of Bézier curves over the years, and a lot of + coffee went into the making of it. I don't regret a minute I spent on writing it, but I can always do with some more coffee to keep on + writing! +
+What's new?
++ This primer is a living document, and so depending on when you last look at it, there may be new content. Click the following link to expand + this section to have a look at what got added, when, or click through to the News posts for more detailed updates. (RSS feed + available) +
+ + + +November 2020
+-
+
Added a section on finding curve/circle intersections
+
October 2020
+-
+
Added the Ukranian locale! Help out in getting its localization to 100%!
+
August-September 2020
+-
+
-
+
+ Completely overhauled the site: the Primer is now a normal web page that works fine with JS disabled, but obviously better with JS + turned on. +
+
+
June 2020
+-
+
Added automatic CI/CD using Github Actions
+
January 2020
+-
+
Added reset buttons to all graphics
+ Updated to preface to correctly describe the on-page maths
+ Fixed the Catmull-Rom section because it had glaring maths errors
+
August 2019
+-
+
Added a section on (plain) rational Bezier curves
+ Improved the Graphic component to allow for sliders
+
December 2018
+-
+
Added a section on curvature and calculating kappa.
+ -
+
+ Added a Patreon page! Head on over to patreon.com/bezierinfo to help support this + site! +
+
+
August 2018
+-
+
Added a section on finding a curve's y, if all you have is the x coordinate.
+
July 2018
+-
+
Rewrote the 3D normals section, implementing and explaining Rotation Minimising Frames.
+ Updated the section on curve order raising/lowering, showing how to get a least-squares optimized lower order curve.
+ -
+
(Finally) updated 'npm test' so that it automatically rebuilds when files are changed while the dev server is running.
+
+
June 2018
+-
+
Added a section on direct curve fitting.
+ Added source links for all graphics.
+ Added this "What's new?" section.
+
April 2017
+-
+
Added a section on 3d normals.
+ Added live-updating for the social link buttons, so they always link to the specific section you're reading.
+
February 2017
+-
+
Finished rewriting the entire codebase for localization.
+
January 2016
+-
+
Added a section to explain the Bezier interval.
+ Rewrote the Primer as a React application.
+
December 2015
+-
+
Set up the split repository between BezierInfo-2 as development repository, and bezierinfo as live page.
+ -
+
+ Removed the need for client-side LaTeX parsing entirely, so the site doesn't take a full minute or more to load all the graphics. +
+
+
May 2015
+-
+
Switched over to pure JS rather than Processing-through-Processing.js
+ Added Cardano's algorithm for finding the roots of a cubic polynomial.
+
April 2015
+-
+
Added a section on arc length approximations.
+
February 2015
+-
+
Added a section on the canonical cubic Bezier form.
+
November 2014
+-
+
Switched to HTTPS.
+
July 2014
+-
+
Added the section on arc approximation.
+
April 2014
+-
+
Added the section on Catmull-Rom fitting.
+
November 2013
+-
+
Added the section on Catmull-Rom / Bezier conversion.
+ Added the section on Bezier cuves as matrices.
+
April 2013
+-
+
Added a section on poly-Beziers.
+ Added a section on boolean shape operations.
+
March 2013
+-
+
First drastic rewrite.
+ Added sections on circle approximations.
+ Added a section on projecting a point onto a curve.
+ Added a section on tangents and normals.
+ Added Legendre-Gauss numerical data tables.
+
October 2011
+-
+
-
+
+ First commit for the bezierinfo site, based on the pre-Primer webpage that covered + the basics of Bezier curves in HTML with Processing.js examples. +
+
+
+
+ + A lightning introduction ++ Let's start with the good stuff: when we're talking about Bézier curves, we're talking about the things that you can see in the following + graphics. They run from some start point to some end point, with their curvature influenced by one or more "intermediate" control points. + Now, because all the graphics on this page are interactive, go manipulate those curves a bit: click-drag the points, and see how their + shape changes based on what you do. +
+
