我编写了一个在给定路径上/上/下绘制字符串的程序。问题是我需要检查实际绘制的字母和所有以前的字母之间的交叉点。我这样做了,而且效果很好。唯一的问题是关于性能。
private void RemoveOverlapping(Graphics gr, float angle, float x, float y, GraphicsPath graphicsPath)
{
Matrix matrix = new Matrix();
for (;;)
{
matrix.Reset();
matrix.RotateAt(angle, new PointF(x, y));
graphicsPath.Transform(matrix);
bool isOverlapping = false;
Region letterRegion = new Region(graphicsPath);
foreach (Region region in _previousRegions)
{
region.Intersect(letterRegion);
if (!region.IsEmpty(gr))
{
matrix.Reset();
matrix.RotateAt(360f - angle, new PointF(x, y));
graphicsPath.Transform(matrix);
matrix.Reset();
matrix.Translate(1, 0);
graphicsPath.Transform(matrix);
isOverlapping = true;
break;
}
}
letterRegion.Dispose();
if (!isOverlapping)
return;
}
}
我做了Alt+F2
测试,它告诉我这region.IsEmpty()
需要大部分计算时间......还有其他方法(不实施额外的算法)来检查两个Regions/GraphicsPaths
交叉点吗?
它是这样的: