How to correctly scale a set of bezier curves?

Started by
11 comments, last by VanillaSnake21 6 years, 8 months ago

I've got a working implementation of 4d and 1d bezier curve font generator, however I'm not sure how to now transition into actually making text. As of right now I create my font by clicking and dragging control vertices on the screen, once I have a few curves aligned I designate it as a letter and save the font. But I'm not sure what coordinate system to use to make sure that I can scale the existing curves to any size? I'm thinking to have the letter sit in like a canonical box with -1 to 1 in both x and y, but then how do I re normalize the curves and still have the ability to plot points directly on screen? As of right now the control vertices are in viewport space of [0 to screen dimention], so when I plot a point I just take the client mouse coordinates. But if I choose to project the final letter to -1 to 1 space, I can only do so once I draw all the curves for that letter as I need the bounding box of all the curves. So what is the right way to approach this? 

 

This is probably a bit convoluted, the point of the question is how do I transition from font editor to actual font. Do I have to unproject the curves when I open them in font editor and duplicate as working copies and only bake the final normalized letter into the font when I'm done editing it or else how would I do it at runtime?

You didn't come into this world. You came out of it, like a wave from the ocean. You are not a stranger here. -Alan Watts

Advertisement

I'm not sure what you ask for, but in any case you seem to reinvent things that have common standarts e.g. TrueType and Postscript, sou you should find some answers by looking at their specs.

I wonder why you don't use those standarts, as there are font editors and also libs to render those fonts with graphics APIs, probably all for free.

One main problem is the horizontal distance between letters. AFAIK this is solved by default left/right bounds, but there are also individual settings for custom pairs of letter, e.g. "LA" should be as close together as possible, while "IL" should have some space between. (I know this from bitmap fonts typical for games like http://www.angelcode.com/products/bmfont/ , probably vector fonts do the same)

It's my own framework, I'm not willing to use anything but the most low level libraries, as I'm not even using a graphics api. My question was how to represent the spline correctly internally so it could both be used in letter glyphs as well as modified in the editor. I've settled on having a duplicate structure at this point, I have one representation for a spline when I'm dragging around it's vertices in the editor and another normalized representation for when it's rendered, I was just looking for a single elegant implementation in this question. 

You didn't come into this world. You came out of it, like a wave from the ocean. You are not a stranger here. -Alan Watts

Why can't your editor just use normalized coordinates, too? After any change to the spline's control points, compute the correct normalization factor to return everything to the unit square, and apply it/redraw.

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

57 minutes ago, ApochPiQ said:

Why can't your editor just use normalized coordinates, too? After any change to the spline's control points, compute the correct normalization factor to return everything to the unit square, and apply it/redraw.

 

Because I can't normalize until I get the final shape of the letter, lets say letter A. Takes 3 curves, / -- \  , if I just renormalize after I add the second curve, the structure shifts to renormalized units, meaning it shifts to the center of the canonical box as I have it now, so I have to manually renormalize once I finalize the letter. That's how I have it now, it's a bit tedious and I was looking for a way to maybe use alternate coordinate systems to have a more elegant implementation, but not every piece of code has to be perfect I guess, just have to settle on this for now.

You didn't come into this world. You came out of it, like a wave from the ocean. You are not a stranger here. -Alan Watts

7 hours ago, VanillaSnake21 said:

It's my own framework, I'm not willing to use anything but the most low level libraries

JoeJ was not saying to adopt the standards or adopt libraries that implement the standard, he was suggesting to just look at how they solved the same problem as a source of inspiration.

9 hours ago, Alberth said:

JoeJ was not saying to adopt the standards or adopt libraries that implement the standard, he was suggesting to just look at how they solved the same problem as a source of inspiration.

 I mean suggesting to dig through a mature open source library code to see how it does a certain specific action is a bit of an overkill imo. If there are some docs you can point me to that deal with this issue, that's another thing.

You didn't come into this world. You came out of it, like a wave from the ocean. You are not a stranger here. -Alan Watts

Maybe looking at example rendering implementations linked at the angelcode webpage helps. (Probably all OpenGL, but it would be the same for a software renderer.) The data per letter is pretty self explaining.

But i don't know if this would help with your problem - i still have no idea what the problem is exactly. Probably it's the same with others. I think you should provide screenshots from your tool and / or some illustration to visualize your problem.

7 hours ago, JoeJ said:

Maybe looking at example rendering implementations linked at the angelcode webpage helps. (Probably all OpenGL, but it would be the same for a software renderer.) The data per letter is pretty self explaining.

But i don't know if this would help with your problem - i still have no idea what the problem is exactly. Probably it's the same with others. I think you should provide screenshots from your tool and / or some illustration to visualize your problem.

 

It's not easy to explain or even draw or demonstrate, I'll try again but bear with me. When I'm making a font in my editor I do so by plotting single control vertices. For every click I create a single control vertex, after I plot 4 of them it makes a 4d bezier curve. Now how do I store the actual positions of the control vertex? Right now I just have them as exact mouse coordinates where I clicked on the screen so CV1(100px, 100px) CV2( 300px, 300px) and so on until CV4 which now makes a curve. These are all in screen space. Now I add a few more curve lets say which form a letter, so all these curves are being manipulated in pixel coordinates. So now if I want to actually use these letters and scale them to any font size, I can't use these screen coordinates anymore, I have to fit the letter in some scalable space like 0 to 1. So I have to convert all the vertex coordinates into that space. Right now I'm doing that manually, I just have a button in my editor called Normalize, so once I'm happy with the letter I've formed, I click normalize and it transforms all the vertices into normalized 0 to 1 space. My question was whether I can avoid doing the normalization manually and work in some space that is normalized from the get go. As in when I plot the point with the mouse, I wouldn't store the location of the mouse as the vertex coordinate, but right away transoform the mouse coordinate into a normalized space. I hope that clears up what my intentions with the question were. It's not really a problem as everything works just fine as of now, I just wanted to know if there is a more elegant way of doing this.

You didn't come into this world. You came out of it, like a wave from the ocean. You are not a stranger here. -Alan Watts

There can be no magic solution.

You want arbitrary sized splines that are normalized. No math can predict how big you will make your splines; to normalize you must by definition know how big the spline is.

The compromise is to draw boundaries ahead of time and force all characters in your font to adhere to predefined dimensions. If you know a glyph's size ahead of time you can draw its splines in normal space.

But you can't have arbitrary glyph dimensions and also eliminate the need for explicit normalization steps.

Wielder of the Sacred Wands
[Work - ArenaNet] [Epoch Language] [Scribblings]

This topic is closed to new replies.

Advertisement