Я пытаюсь понять, как полностью заполнить пользовательскую геометрию. Похоже, что это должен быть общий вопрос, но я действительно не смог найти решения.Полностью заполняя пользовательские геометрии
У меня есть следующий пример геометрии:
<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 выглядит, как если бы я гарантировать, что все три смежных геометрий перекрывают друг друга и создать unioned 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>
И вот результат:
Я был хопи ng он объединил бы просто штрихи и автоматически определял правильное заполнение для нового смежного полигона ... bummer.
EDIT 2:
Хм, так что я думаю, что я придумал пару возможных решений, ни один из которых так же просто, как я надеялся, что они будут. Первый вариант состоял бы в том, чтобы объединить все геометрии, как указано выше, с помощью структуры CombineGeometry, затем я назвал «GetFlattenedPathGeometry» на итоговой «CombineGeometry», чтобы получить PathGeometry. Затем я перебираю каждую фигуру в PathGeometry и просто удаляю те, которые являются отверстиями (которые, я думаю, вы должны сделать, избавляясь от всех фигур, которые полностью содержатся другим, или отверстия могут следовать за соглашением о том, что либо по часовой стрелке или против часовой стрелки, не уверен.), если все идет хорошо, вам следует оставить одну полностью заполненную геометрию.
Второй вариант заключается в том, чтобы снова вызвать «GetFlattenedPathGeometry» на любом результирующем пути, чтобы получить многоугольную аппроксимацию пути на основе вершин (без обозначения всей кривой, дуги, эллипса и т. Д., Мы хотим, чтобы путь, содержащий только точки и линии). После этого вы просто объедините все результирующие фигуры/сегменты в одну фигуру, сегменты которой упорядочены либо по часовой стрелке, либо против часовой стрелки.
Я тестировал оба подхода, и они, похоже, работают, по крайней мере, с простым тестовым примером, описанным выше, хотя они не будут работать с более сложными формами (самопересекающимися, вогнутыми и т. Д.) .. поддержкой, которые мне требуются. поэтому вопрос остается, как мне это сделать?
РЕДАКТИРОВАТЬ 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>
Который производит:
Спасибо за ваш ответ. Под «закрытием отверстия» вы подразумеваете отверстие в заливе или небольшой зазор между соседними геометриями? Если вы имеете в виду пробел между геометриями, я вскоре опубликую короткое сообщение с грубым примером CombinedGeometry, который, похоже, имеет такую же проблему, когда штрихи смежных геометрий перекрываются и объединяются с объединением. Еще раз спасибо! – Craig
Счастливые помочь. Я имел в виду большую область, которую вы пытаетесь заполнить, а не небольшой промежуток между соседними геометриями. Как показывает ваш отредактированный эксперимент, объединенное объединение нескольких фигур не устраняет дыру. Я не мог найти никаких функций в WPF, которые бы идентифицировали и удаляли отверстия, заключенные в касание или перекрывающиеся геометрии. Ваш подход сочетания геометрии и удаления фигур, которые полностью закрыты, звучит как отличный старт. – Scott