12,064,368 members (56,514 online)
I searched the internet for a long time for some algorithm to display a "Text on a Path", but I only fond the Batik SVG Toolkit. It's a Java project for displaying SVG. SVG has the ability to display "Text on a Path", but I only needed the Text on Path functionality.
So, I started recollecting my old math education, and coded the first lines to calculate the angle of defined position on a path.
Do you remember a²+b²=c²? That is the base to solve this problem. You need two points on a straight line.
Private Function GetAngle(ByVal _point1 As PointF, _ ByVal _point2 As PointF) As Decimal Dim c As Decimal c = Math.Sqrt((_point2.X - _point1.X) ^ 2 + _ (_point2.Y - _point1.Y) ^ 2) 'Oh yeah good old math a²+b²=c² If c = 0 Then Return 0 End If 'We must change the side where the triangle is If _point1.X > _point2.X Then Return Math.Asin((_point1.Y - _point2.Y) / c) * _ 180 / Math.PI - 180 Else Return Math.Asin((_point2.Y - _point1.Y) / c) * _ 180 / Math.PI End If End Function
You can use the
TextOnPath class to get a bitmap with the text on the given path.
The path must be set as
PathData. You can also the the
Above) and the align the text (
Dim _points(5) As PointF Dim _top As TextOnPath.TextOnPath = New TextOnPath.TextOnPath Dim _gp As GraphicsPath = New GraphicsPath _points(0) = New PointF(81, 183) _points(1) = New PointF(321, 305) _points(2) = New PointF(333, 622) _points(3) = New PointF(854, 632) _points(4) = New PointF(864, 153) _points(5) = New PointF(562, 224) _gp.AddCurve(_points) _top.PathDataTOP = _gp.PathData _top.FontTOP = New Font("Microsoft Sans Serif", _ 36, FontStyle.Regular) _top.FillColorTOP = Color.Black _top.ColorTOP = Color.White _top.TextTOP = "Text on path goes around a path" _top.ShowPath = True _top.PathAlignTOP = TextOnPath.PathAlign.Center _top.LetterSpacePercentage = 100 _top.TextPathPosition = TextOnPath.TextPosition.CenterPath Dim oBitmap as Bitmap oBitmap = _top.TextOnPathBitmap
You can also get the new path data as an SVG string, so you can use it in HTML with Adobe SVG Viewer, or in Corel Draw or Adobe Illustrator.
Dim _svg As String _svg = _top.GetSVG(1024, 768)
If someone has ideas to optimize this code, please contact me, and sorry for the bad English and the short description. This is my first article, and I'm still learning.