Hacker News new | ask | show | jobs
by WillAdams 804 days ago
Do you have a need to?

Do you have a project which might be able to make use of this? What sort of work do you do?

I am bookmarking this for re-reading later because I hope it will help me to understand how to implement Bézier curves in a tool I've been working on for controlling a CNC machine/creating files for cutting on a CNC:

https://github.com/WillAdams/gcodepreview

(but first I have to get arcs working)

3 comments

For bezier curves in Python try this:

    def bezier(t, *points):
      if len(points) <= 1:
        return points[0]

      next_set = []
      for i in range(1, len(points)):
        next_set.append([p[0] + t * (p[1] - p[0]) for p in zip(points[i - 1], points[i])])

      return bezier(t, *next_set)
That'll compute a point along your bezier curve. The `t` parameter is how far along the curve you want to go, 0 <= t <= 1. You can give it as many dimensions and whatever order (number of handles) you want. So for example, to get a cubic bezier curve on a 2d plane from (0, 0) to (1, 1) with handles at (1, 0), (0, 1) (an aggressive ease-in/ease-out curve) with 9 segments (10 points) you'd run:

    n = 10
    for t in range(n):
      print(
        bezier(
          t / (n - 1),
          (0, 0),
          (1, 0),
          (0, 1),
          (1, 1)
          ))
I think that's right. I did it from memory. Obviously don't mix 2d and 3d, but it should work if all points have the same number of dimensions.
Oh, there is no guarantee about the spacing of these points. They won't be equidistant from each other, the points may cluster towards one end of the curve or another. With an infinite number of points you'll get the correct curve, but experiment with it to determine how finite you're willing to go.

I was also able to do this in OpenScad. The technique is the same. I was 3d printing a router template for rounding off corners of tables that used splines like this so it wasn't as obvious where the corners started and ended. I think ~40 points was accurate enough for me, but I was hitting the corner with sandpaper afterwards.

Thanks! I'll definitely give that a go when I get to that point.

Like I said, arcs are next (once I finish a re-write as a "Literate Program", 'cause managing stuff spread across three files has gotten to be a pain. I'm going to try the docmfp package as something straight-forward enough for me to wrap my mind around and which I can use on pretty much any computer I'm inclined to.

Nice project! I see the tool can already handle polylines, so in theory you should be able to add support for Bézier curves and arcs by converting them to polylines. But of course, the devil is usually in the details. I hope it works out.
Yes, the details have gotten so niggling that I've decided it's time for a re-write as a "Literate Program" as noted elsethread. I'll be using the docmfp package which I think will keep the complexity manageable, we'll see.
If you're into this kind of geometry, and CNC, we could use some more eyeballs on Solvespace. I'd like better g-code generation.
I've tried Solvespace a couple of times, but haven't done well with it --- I wish that it was scriptable and that there was some sort of support for Bézier curves --- please feel free to make use of any of my code/concepts, but it's a pretty small codebase (and weird to boot) and I doubt anything which is helpful couldn't be coded up by someone else about as quickly as they could read through my code to repurpose it.