Я пытаюсь выяснить, как полностью заполнить пользовательскую геометрию. Кажется, это должен быть распространенный вопрос, но я не смог найти решения.
У меня есть следующий пример геометрии:
<Path Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
<Path.Data>
<PathGeometry
Figures="M112,296C112,296 136,296 136,320 M112,344C112,344 136,344 136,320 M112,296L112,296 96,296 96,344 112,344"/>
</Path.Data>
</Path>
Который дает следующий результат:

Вот результат, который я хотел бы увидеть:

Есть идеи? Я знаю, что мог бы создать одну дугу, и это разрешило бы этот конкретный случай, но в моем приложении пользователь может нарисовать любой тип геометрии, чтобы результат мог состоять из любого числа «примитивов» (PolyLineSegments, EllipseGeometries, ArcSegments и т. Д.) и в случае, если результирующая геометрия содержит некоторый тип замкнутой области, я бы хотел точно заполнить эту область.
EDIT:
Вот пример того, как выглядит CombinedGeometry, если я обеспечу перекрытие всех трех смежных геометрий и создаю объединенную CombinedGeometry со следующим кодом:
<Path Grid.Row="2" Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
<Path.Data>
<CombinedGeometry GeometryCombineMode="Union">
<CombinedGeometry.Geometry1>
<CombinedGeometry GeometryCombineMode="Union">
<CombinedGeometry.Geometry1>
<PathGeometry
Figures="M111,293C111,296 136,293 136,325"/>
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<PathGeometry
Figures="M111,346C111,344 136,344 136,320"/>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</CombinedGeometry.Geometry1>
<CombinedGeometry.Geometry2>
<PathGeometry
Figures="M125,296L115,296 96,296 96,344 120,344"/>
</CombinedGeometry.Geometry2>
</CombinedGeometry>
</Path.Data>
</Path>
А вот и результат:

Я надеялся, что это объединит только штрихи и автоматически определит правильную заливку для нового смежного многоугольника ... облом.
РЕДАКТИРОВАТЬ 2:
Хм, так что я думаю, что я нашел пару возможных решений, ни одно из которых не так просто, как я надеялся. Первым вариантом было бы объединить все геометрии, как описано выше, используя структуру CombineGeometry, затем я вызвал «GetFlattenPathGeometry» для результирующего «CombineGeometry», чтобы получить PathGeometry. Затем я перебираю каждую фигуру в PathGeometry и просто удаляю те, которые являются отверстиями (что, я думаю, вы должны сделать, избавившись от всех фигур, которые полностью содержатся в другой, иначе дыры могут следовать соглашению, что либо по часовой стрелке или против часовой стрелки, не уверен ..), если все пойдет хорошо, вам останется одна полностью заполненная геометрия.
Второй вариант заключается в том, чтобы снова вызвать «GetFlattenPathGeometry» для любого результирующего пути, чтобы получить полигональную аппроксимацию пути на основе вершин (без всех обозначений кривой, дуги, эллипса и т. Д. Нам нужен путь содержит только точки и линии). После этого вы просто объедините все полученные фигуры / сегменты в одну фигуру, чьи сегменты упорядочены по часовой стрелке или против часовой стрелки.
Я протестировал оба подхода, и они, по-видимому, работают по крайней мере с простым тестовым примером, описанным выше, хотя они не будут работать с более сложными формами (самопересекающимися, вогнутыми и т. Д.) ... поддержка, которая мне требуется ... так что остается вопрос, как мне это сделать?
РЕДАКТИРОВАТЬ 3:
Вот более сложная геометрия, в которой упорядочение / объединение становится более сложным:
<Path Fill="White" Stretch="Fill" Stroke="Black" StrokeThickness="2">
<Path.Data>
<PathGeometry
Figures="M104,160C104,160 72,160 72,136
M104,128C104,128 72,128 72,152
M152,232L152,232 152,216 120,216 120,160 128,160
M152,232L152,232 72,232 104,216 104,160 96,160
M104,128L104,128 168,128
M128,160L128,160 168,160
M165,160L168,160 200,128
M200,160L200,160 200,128
M200,160L200,160 168,128 152,128"/>
</Path.Data>
</Path>
Который производит:
