Click here to Skip to main content
15,886,798 members
Articles / Programming Languages / C#
Tip/Trick

Poor Man's Vector Drawing

Rate me:
Please Sign up or sign in to vote.
5.00/5 (9 votes)
2 Mar 2021CPOL1 min read 5K   4   1
Sometimes you need to draw a simple glyph.
An intuitive way to define and draw a simple glyph that scales.

Background

Sometimes, you need to draw a simple glyph such as a tick or a resize handle. Here's a neat trick you can use to avoid wildly searching for the correct transparent icon of a correct size and style, or the right Awesome Font glyph.

At the heart of this trick is a counter- intuitive idea that thinking in fractions (i.e., percentage) is easier than thinking in absolute units. For example - if you want to draw a letter 'X' and your "vector" coordinate system allows only values between 0 and 1, then you can define it by drawing two lines:

  • a (diagonal) line from (0.25, 0.25) to (0.75, 0.75), and
  • a line from (0.75, 0.25) to (0.25, 0.75).

The Code

Let us define two glyphs - letter 'X', and a tick in C#.

C#
// Letter X (close window glyph)
PointF[][] X = new PointF[][] {
    new PointF[] { new PointF( 0.25f, 0.25f ), new PointF( 0.75f, 0.75f ) },
    new PointF[] { new PointF( 0.75f, 0.25f ), new PointF( 0.25f, 0.75f ) }
};
// Tick. 
PointF[][] tick = new PointF[][] { 
    new PointF[] { new PointF( 0.3f, 0.6f ), 
                   new PointF( 0.4f, 0.8f ), new PointF( 0.7f, 0.2f) } 
};

To get absolute coordinates, we multiply these relative coordinates with absolute width and height of our destination area.

 

Let us assume the size of your window is 640 x 400 pixels and you want to draw a pixel at the center (0.5, 0.5). You simply multiply it by width width and height and you get 320, 200.

We draw our "vector glyph" like this:

C#
foreach (PointF[] lines in X)         // ...g is graphics, w is width, h is height
    g.DrawLines(Pens.Black, lines.Select(p => new PointF(p.X*w, p.Y*h)).ToArray());

And that's the whole trick. Nothing spectacular. In WPF, you can use geometry instead.

I find it useful to quickly implement simple (flat!) glyphs, such as mail glyph, resize and maximize window glyphs, arrows glyphs, etc. You can experiment by scaling your pen thickness and/or adding simple arcs.

History

  • 2nd March, 2021: Initial version

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Founder Wischner Ltd
United Kingdom United Kingdom
Writing code since 1982 and still enjoying it.

Comments and Discussions

 
AnswerMessage Closed Pin
4-Mar-21 15:29
Joana Angeline4-Mar-21 15:29 
GeneralMy vote of 5 Pin
Barry Dowdeswell2-Mar-21 20:54
professionalBarry Dowdeswell2-Mar-21 20:54 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.