Извлечь геометрию из шрифта

Я хотел бы иметь возможность извлекать геометрию для каждой буквы в файле шрифта TrueType. Каждая буква будет иметь набор координат, если каждая буква находится в своей собственной сетке.

Поскольку изображение говорит о тысяче слов - я хотел бы получить вершины для букв, подобные изображению ниже (любезно предоставлено http://polymaps.org/ )

alt text

Обновление

Благодаря подсказке по использованию GDI, которая теперь включена в .NET System.Drawing.Drawing2D, я получил следующий код для создания многоугольников WKT. Кривые Безье невозможны. И даже после того, как буквы были перевернуты и повернуты, некоторые пути все равно не соединялись правильно.

        // C# Visual Studio

        GraphicsPath gp = new GraphicsPath();

        Point origin = new Point(0, 0);
        StringFormat format = new StringFormat();
        FontFamily ff = new FontFamily("Arial");
        //enter letter here
        gp.AddString("T", ff, 0, 12, origin, format); //ABCDEFGHIJKLMNOPQRSTUVWXYZ

        StringBuilder sb = new StringBuilder();
        sb.AppendLine("DECLARE @g geometry;");
        sb.Append("SET @g = geometry::STGeomFromText('POLYGON ((");


        Matrix flipmatrix = new Matrix(-1, 0, 0, 1, 0, 0);
        gp.Transform(flipmatrix);
        Matrix rotationtransform = new Matrix();

        RectangleF r = gp.GetBounds();

        // Get center point
        PointF rotationPoint = new PointF(r.Left + (r.Width / 2), r.Top + (r.Height / 2));
        rotationtransform.RotateAt(180, rotationPoint);
        gp.Transform(rotationtransform);
        //gp.CloseAllFigures(); //make sure the polygon is closed - does not work

        foreach (PointF pt in gp.PathData.Points)
        {
            sb.AppendFormat("{0} {1},", pt.X, pt.Y);

        }
        PointF firstpoint = gp.PathData.Points[0];

        sb.AppendFormat("{0} {1}", firstpoint.X, firstpoint.Y); //make last point same as first
        sb.Append("))',0);");
        sb.AppendLine("");
        sb.AppendLine("SELECT @g");
        System.Diagnostics.Debug.WriteLine(sb.ToString());

alt textalt text

8
задан Marky0 1 January 2017 в 03:36
поделиться