我有一個虛線(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);
}
現在我需要的只有一兩件事,完成我的問題。我不希望字符串彼此重疊。有任何想法嗎?唉唉,當我們無法繪製路徑上的字符串(因爲中斷量過多的,應行(中間的頂部)上面繪製
這裏是不必要的重疊的例子:
輸入的字符串是「行上的某些文本」還是「某些文本」,「在行上」? –
我得到整個字符串,所以「一些文本就行」:SI必須自己分割它 – Nickon
您可以使用DrawString在適當的RotateTransform之後繪製旋轉的文本(更多內容請參見http://msdn.microsoft.com/zh-cn/ -us/library/a0z3f662(v = vs.100).aspx),您可以使用MeasureString方法(http://msdn.microsoft.com/zh-cn/library/system.drawing)查看字符串的寬度。 graphics.measurestring(v = VS.100)的.aspx)。這可以幫助你分割文本 – BlackBear