As part of an iOS app I’m making, I want to draw a decent approximation of an Archimedes spiral. The drawing library I’m using (CGPath in Quartz 2D, which is C-based) supports arcs as well as cubic and quadratic Bézier curves. What is a good method of approximating an Archimedes spiral using either of these path types? For example the wikipedia exemplar image says it was “drawn as a series of minimum-error Bézier segments.” How would one generate such segments?

My math background takes me through Calculus III plus some stuff I picked up from a classical mechanics class, but it’s been a couple of years so I’m rusty. What I have so far:

For a spiral r = a + b $\theta$, I used the information from this page to find that the cartesian slope at any point (r, $\theta$) is equal to

$$\frac{dy}{dx}=\frac{b\sin\theta\space+\space(a + b\theta)\cos\theta}{b\cos\theta\space-\space(a + b\theta)\sin\theta}$$

From here, I could use point-slope to find the equation of a tangent line at any point, but how do I go about finding the proper lengths of the handles (i.e. the positions of the middle two points) for the curve? Or would an approximation with circular arc segments be better/easier/faster?

If I can’t figure it out, I’ll just use a static image in the app, but it occurs to me that I don’t even know of a way to generate a high-quality image of an Archimedes spiral! The Spiral tool in Illustrator, for example, does only logarithmic spirals.

  • $\begingroup$ Your drawing library can't evaluate trigonometric functions? $\endgroup$ – J. M. is a poor mathematician Aug 5 '12 at 5:21
  • $\begingroup$ You mean sin/cos/tan? I'm using C, so yes, I can. What are you getting at? $\endgroup$ – Zev Eisenberg Aug 5 '12 at 5:24
  • 1
    $\begingroup$ Then, why not just use the actual parametric equations for the Archimedean spiral instead of trying to draw a Bézier approximation? $\endgroup$ – J. M. is a poor mathematician Aug 5 '12 at 5:28
  • $\begingroup$ @J.M. Most drawing libraries outside of specialized math software only allow drawing primitives like line segments, ellipses, and cubic Bézier curves, but not arbitrary parametric curves. I expect Zev can evaluate trigonometric functions to pick the parameters for these primitives, but cannot make the curve follow an arbitrary parametric path. $\endgroup$ – Rahul Aug 5 '12 at 5:41
  • $\begingroup$ Right you are @RahulNarain. Wish I could do that! $\endgroup$ – Zev Eisenberg Aug 5 '12 at 5:44

So it looks like the Wikipedia reference image uses 45 degree sections of these curves. You can use the equation for the spiral to give you the tangent line at the beginning and end of these curve sections. Evaluate the derivative at these two points to get the tangent line slope and then shift your line appropriately to hit the point used. The intersection Of these two lines should be your control point. Once you have found your control point you can put it in the function 'CGPathAddQuadCurveToPoint' for the cx, cy (I think) along with the point you want to go to (also from the spiral equation). For reference--check out the animation under 'quadratic curves' here

For extra speed, you only have to find 8 tangent lines max--just shift them out for the next cycle of the spiral and reuse them.

  • $\begingroup$ I think your Wikipedia link might work better if you use the syntax [link text](URL goes here). $\endgroup$ – Rahul Aug 5 '12 at 5:46
  • $\begingroup$ So, if I understand you, I use the intersection of adjacent tangent lines as the control points for my quad curves? $\endgroup$ – Zev Eisenberg Aug 5 '12 at 5:46
  • $\begingroup$ Your wikipedia link is from the mobile site, and the Stack Exchange link parser doesn't like it. Here's the desktop link: en.wikipedia.org/wiki/… $\endgroup$ – Zev Eisenberg Aug 5 '12 at 5:49
  • 1
    $\begingroup$ @Zav Eisenberg the lines on the animation on Wikipedia are tangent lines, the define the control point. So yes, that is the point you use. $\endgroup$ – JoshRagem Aug 5 '12 at 5:49
  • $\begingroup$ Thanks for the link, I was typing on my phone so it's a little trickier. $\endgroup$ – JoshRagem Aug 5 '12 at 5:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.