我有一条折线(PointF[]
),一些string
和Graphics
对象。现在我想在我的线上画这个字符串。
这是一个例子:
是否有任何算法可以以最简单的方式做到这一点?
[编辑] 好的,我尝试了@endofzero 的代码并稍作修改。这是整个解决方案(带有角度和距离计算):
private static void DrawBrokenString(Graphics g, IList<PointF> line, string text, Font font)
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.AntiAlias;
Pen pen = new Pen(Brushes.Black);
for (int index = 0; index < line.Count - 1; index++)
{
float distance = GetDistance(line[index], line[index + 1]);
if (text.Length > 0)
{
for (int cIndex = text.Length; cIndex >= 0; cIndex--)
{
SizeF textSize = g.MeasureString(text.Substring(0, cIndex).Trim(), font);
if (textSize.Width <= distance)
{
float rotation = GetAngle(line[index], line[index + 1]);
g.TranslateTransform(line[index].X, line[index].Y);
g.RotateTransform(rotation);
if (index != line.Count - 2)
{
g.DrawString(text.Substring(0, cIndex).Trim(), font, new SolidBrush(Color.Black),
new PointF(0, -textSize.Height));
}
else
{
g.DrawString(text.Trim(), font, new SolidBrush(Color.Black),
new PointF(0, -textSize.Height));
}
g.RotateTransform(-rotation);
g.TranslateTransform(-line[index].X, -line[index].Y);
text = text.Remove(0, cIndex);
break;
}
}
}
else
{
break;
}
g.DrawLine(pen, line[index].X, line[index].Y, line[index + 1].X, line[index + 1].Y);
}
}
private static float GetDistance(PointF p1, PointF p2)
{
return (float) Math.Sqrt(Math.Pow(p2.X - p1.X, 2) + Math.Pow(p2.Y - p1.Y, 2));
}
private static float GetAngle(PointF p1, PointF p2)
{
float c = (float) Math.Sqrt(Math.Pow(p2.X - p1.X, 2) + Math.Pow(p2.Y - p1.Y, 2));
if (c == 0)
return 0;
if (p1.X > p2.X)
return (float) (Math.Asin((p1.Y - p2.Y)/c)*180/Math.PI - 180);
return (float) (Math.Asin((p2.Y - p1.Y)/c)*180/Math.PI);
}
现在我只需要一件事来完成我的问题。我不希望字符串相互重叠。有任何想法吗?啊,当我们不能在路径上画一个字符串时(因为有太多的断点,它应该画在线的上方(中间顶部)。
这是不需要的重叠的示例: