---
title: "Measuring Characters Positions"
canonical: https://www.graphicsmill.com/docs/gm5/MeasuringCharactersPositions.htm
product: "Graphics Mill 5.5 for .NET"
---

This documentation is for the old version. [Go to the latest Graphics Mill docs](https://www.graphicsmill.com/docs/gm/)

# Measuring Characters Positions
 
To obtain each character position of a single-line text sting drawn by the [GdiGraphics.DrawString](https://www.graphicsmill.com/docs/gm5/O_T_Aurigma_GraphicsMill_Drawing_GdiGraphics_DrawString.htm.md) method, use method [Font.GetCharacterPositions(String, Single)](https://www.graphicsmill.com/docs/gm5/M_Aurigma_GraphicsMill_Drawing_Font_GetCharacterPositions_2_1dbfa9fa.htm.md). It returns an array containing the X coordinate of each character in a given text string. If font tracking is modified with [Tracking](https://www.graphicsmill.com/docs/gm5/P_Aurigma_GraphicsMill_Drawing_Font_Tracking.htm.md) property, it is taken into account. The code example below demonstrates how to use this array to draw text on the curve:
 
![Text on the curve](https://www.graphicsmill.com/docs/gm5/TextOnCurve.png)
 
This image was produced with the following code:
 
```
Const centerX As Integer = 150
Const centerY As Integer = 150
Const radius As Integer = 110

'Create Bitmap object
Dim bitmap As New Aurigma.GraphicsMill.Bitmap(300, 150, _
    Aurigma.GraphicsMill.PixelFormat.Format24bppRgb)

Dim graphics As Aurigma.GraphicsMill.Drawing.GdiGraphics = _
    bitmap.GetGdiGraphics()

'Fill background
graphics.FillRectangle(New Aurigma.GraphicsMill.Drawing.SolidBrush( _
    Aurigma.GraphicsMill.RgbColor.White), 0, 0, bitmap.Width, bitmap.Height)

' Adjust font settings
Dim font As New Aurigma.GraphicsMill.Drawing.Font( _
    "Times New Roman", 37, False, False)
font.VerticalAlignment = Aurigma.GraphicsMill.Drawing.VerticalAlignment.Bottom
font.HorizontalAlignment = Aurigma.GraphicsMill.Drawing.HorizontalAlignment.Center

Dim text As String = "Rounded sample text"

'Get characters positions
Dim positions As Single() = font.GetCharacterPositions(text, 0)
'Get string width
Dim strWidth As Single = font.MeasureString(text).Width
'Get string height
Dim strHeight As Single = font.MeasureString(text).Height

'Draw ellipse
graphics.DrawEllipse(New Aurigma.GraphicsMill.Drawing.Pen( _
    Aurigma.GraphicsMill.RgbColor.Black, 1), 40, 40, 220, 220)

Dim brush As New Aurigma.GraphicsMill.Drawing.SolidBrush(Aurigma.GraphicsMill.RgbColor.Black)

'Draw character by character
For i As Integer = 0 To text.Length - 1
    Dim charWidth As Single = font.GetBlackBox(text(i)).Width

    'Compute angle to which current character will be rotated. Rotation will be
    'performed relative to the middle of the bottom side of the character.
    Dim angle As Single = Math.PI - (positions(i) + charWidth / 2.0F) * Math.PI / strWidth

    'Compute the x and y coordinate of the bottom/top* middle* of the character
    Dim x As Single = centerX + radius * Math.Cos(angle)
    Dim y As Single = centerY - radius * Math.Sin(angle)

    Dim rotateMatrix As New System.Drawing.Drawing2D.Matrix()

    'Convert angle from radians to degrees
    Dim degAngle As Single = angle / Math.PI * 180
    rotateMatrix.RotateAt(90 - degAngle, New System.Drawing.PointF(x, y))
    graphics.Transform = rotateMatrix
    graphics.DrawString(text(i).ToString(), font, brush, x, y)
Next
```
 
```csharp
const int centerX = 150;
const int centerY = 150;
const int radius = 110;

//Create Bitmap object
Aurigma.GraphicsMill.Bitmap bitmap =
    new Aurigma.GraphicsMill.Bitmap(300, 150, Aurigma.GraphicsMill.PixelFormat.Format24bppRgb);

Aurigma.GraphicsMill.Drawing.GdiGraphics graphics = bitmap.GetGdiGraphics();

//Fill background
graphics.FillRectangle(new Aurigma.GraphicsMill.Drawing.SolidBrush(
    Aurigma.GraphicsMill.RgbColor.White), 0, 0, bitmap.Width, bitmap.Height);

//Adjust font settings
Aurigma.GraphicsMill.Drawing.Font font =
    new Aurigma.GraphicsMill.Drawing.Font("Times New Roman", 37, false, false);
font.VerticalAlignment = Aurigma.GraphicsMill.Drawing.VerticalAlignment.Bottom;
font.HorizontalAlignment = Aurigma.GraphicsMill.Drawing.HorizontalAlignment.Center;

string text = "Rounded sample text";

//Get characters positions
float[] positions = font.GetCharacterPositions(text, 0);
//Get string width
float strWidth = font.MeasureString(text).Width;
//Get string height
float strHeight = font.MeasureString(text).Height;

//Draw ellipse
graphics.DrawEllipse(new Aurigma.GraphicsMill.Drawing.Pen(
    Aurigma.GraphicsMill.RgbColor.Black, 1), 40, 40, 220, 220);

Aurigma.GraphicsMill.Drawing.SolidBrush brush =
    new Aurigma.GraphicsMill.Drawing.SolidBrush(Aurigma.GraphicsMill.RgbColor.Black);

//Draw character by character
for (int i = 0; i < text.Length; i++)
{
    float charWidth = font.GetBlackBox(text[i]).Width;

    //Compute angle to which rotate current character. Rotation will be
    //performed relative to the middle of the bottom side of the character.
    float angle = (float)(Math.PI - (positions[i] + charWidth / 2.0f) * Math.PI / strWidth);

    //Compute the x and y coordinate of the bottom/top* middle* of the character
    float x = (float)(centerX + radius * Math.Cos(angle));
    float y = (float)(centerY - radius * Math.Sin(angle));

    System.Drawing.Drawing2D.Matrix rotateMatrix = new System.Drawing.Drawing2D.Matrix();

    //Convert angle from radians to degrees
    float degAngle = (float)(angle / Math.PI * 180);

    rotateMatrix.RotateAt(90 - degAngle, new System.Drawing.PointF(x, y));

    graphics.Transform = rotateMatrix;

    graphics.DrawString(text[i].ToString(), font, brush, x, y);
}
```
 
## See Also
  
### Reference
 
- [Font Class](https://www.graphicsmill.com/docs/gm5/T_Aurigma_GraphicsMill_Drawing_Font.htm.md)
- [GdiGraphics Class](https://www.graphicsmill.com/docs/gm5/T_Aurigma_GraphicsMill_Drawing_GdiGraphics.htm.md)
- [GdiGraphics.DrawString Overload](https://www.graphicsmill.com/docs/gm5/O_T_Aurigma_GraphicsMill_Drawing_GdiGraphics_DrawString.htm.md)
- [Font.MeasureString(String) Method](https://www.graphicsmill.com/docs/gm5/M_Aurigma_GraphicsMill_Drawing_Font_MeasureString_1_bb3a7a4f.htm.md)

### Manual
 
- [Drawing Text String](https://www.graphicsmill.com/docs/gm5/DrawingTextString.htm.md)
- [Measuring Text Size](https://www.graphicsmill.com/docs/gm5/MeasuringTextSize.htm.md)
