Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I have a general question about creating a drawing application, the language could be C++ or ObjectiveC with OpenGL. I would like to hear what are the best methods and practices for storing strokes data. Think of the many iPad apps that allow you to draw with your finger (or a stylus) or any other similar function on a desktop app.

To summarize, the data structure must:

  • be highly responsive to the movement
  • store precise values (close in space / time)
  • usable for rendering the strokes with complex textures (textures based on the dynamic of the stroke etc)
  • exportable to a text file for saving/loading
share|improve this question
    
What have you tried and why doesn't it work? What have you looked at already and why can't you replicate it? Why aren't the available API's sufficient for your use? –  Steve Evers Oct 10 '12 at 19:49
    
Well I still haven't tried much and I'm still trying to get my head around it, which is why I'm asking here for suggestions on starting points, techniques, ... It's more complex than I thought –  mαττjαĸøb Oct 10 '12 at 22:19

2 Answers 2

Regardless of the data structure you use it may be helpful to remove unneeded data points using an algorithm like the Ramer–Douglas–Peucker algorithm. It will take a linear piecewise curve and remove points that deviate less than some small amount from the curve at large. This way, if your user draws a more or less straight line, you wont store every intermediate point where their finger has been.

The problem is how to simplify and smooth piecewise linear curves. There's a free paper here Efficient Smoothing of Piecewise Linear Paths with Minimal Deviation (there's a PDF link to the right).

As World Engineer mentioned in his answer, vector graphics are an option. SVG is a popular format and it's based on XML so it's easy to manipulate with existing tools. Along with plain old "points" it can handle paths (Bézier and elliptic), text, shapes, styling info (stroke etc.) and much more. SVG gives you the tools to render your user's drawing as exactly as you'd like. SVG images also supported in most browsers. Also, since it's a well established format I'm sure there are plenty of existing libraries for manipulating the images, ex. simple-svg. Or there's always good old bitmaps.

I imagine the process would go something like:

  1. Wait for user to draw a curve
  2. Simplify the curve (as much or as little as you would like)
  3. Render the simplified curve, path, shape, etc. to the canvas using the selected style.
share|improve this answer

I'd recommend storing it as a vector graphics image. There are data structures that do this kind of thing. As far as precision, Vector Graphics are very precise. Response will largely be a question of the implementation keeping overhead and locking to a minimum.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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