Cody
Я не видел, чтобы вы уже приняли ответ, поэтому я помещаю эту функцию C # здесь, чтобы вы поняли, помогает ли она. Это было проверено.
Немного отличается от версии выше: эта процедура ищет путь с наибольшей ограничивающей областью, поэтому она немного более щедра, чем версия выше, так как ей не требуется, чтобы "главный" путь проходил 2 теста, чтобы доказать что это достойно хранения.
Я превратил это в метод расширения, поэтому в .Net вы можете просто написать:
GraphicsPath solid = LetterPath.ToSolidPath();
Возвращаемое значение - новый GraphicsPath, внутренняя часть которого была потрошена (вау, я не часто использую это слово).
/// <summary>
/// Removes all subpaths (holes) from a graphics path, leaving only the largest whole path behind
/// </summary>
public static GraphicsPath ToSolidPath(this GraphicsPath path)
{
GraphicsPath BiggestPath = null;
GraphicsPath SubPath = new GraphicsPath();
RectangleF BoundsRect = RectangleF.Empty;
RectangleF BiggestRect = RectangleF.Empty;
bool bIsClosed = false;
var pathIterator = new GraphicsPathIterator(path);
pathIterator.Rewind();
for (int i = 0; i < pathIterator.SubpathCount; i++)
{
SubPath.Reset();
pathIterator.NextSubpath(SubPath, out bIsClosed);
BoundsRect = SubPath.GetBounds();
if (BoundsRect.Width * BoundsRect.Height > BiggestRect.Width * BiggestRect.Height)
{
BiggestRect = BoundsRect;
BiggestPath = (GraphicsPath)SubPath.Clone();
}
}
return BiggestPath;
}