Próbuję dowiedzieć się, jak całkowicie wypełnić niestandardową geometrię. Wygląda na to, że powinno to być powszechne pytanie, ale tak naprawdę nie byłem w stanie znaleźć żadnych rozwiązań.Napełnianie niestandardowych geometrii
Mam następujący przykład geometria:
<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>
która produkuje następujący wynik:
Jest to wynik chciałbym zobaczyć:
Dowolny Pomysły? Wiem, że mógłbym stworzyć pojedynczy łuk, który rozwiązałby ten konkretny przypadek, ale w mojej aplikacji użytkownik może narysować dowolny rodzaj geometrii, aby wynik mógł składać się z dowolnej liczby "prymitywów" (PolyLineSegments, EllipseGeometries, ArcSegments itd.) aw przypadku, gdy wynikowa geometria zawiera pewien rodzaj zamkniętego obszaru, chciałbym dokładnie wypełnić ten obszar.
EDIT:
Oto przykład tego, co CombinedGeometry wygląda jakbym zapewnić wszystkie trzy sąsiednie geometrie pokrywają się i stworzyć unioned CombinedGeometry z następującego kodu:
<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>
I tu jest rezultat:
byłem Hopi ng to połączenie tylko pociągnięć i automagicznie znaleźć prawidłowe wypełnienie nowego, ciągłego wielokąta ... bummer.
EDIT 2:
Hmm więc myślę, że mam wymyślić kilka możliwych rozwiązań, z których żaden nie jest tak proste, jak ja ufałem byliby. Pierwszą opcją byłoby połączenie wszystkich geometrii jak powyżej za pomocą struktury CombineGeometry, a następnie nazwałem "GetFlattenedPathGeometry" na wynikowej "CombineGeometry" w celu uzyskania PathGeometry. Następnie powtarzam każdy rysunek w PathGeometry i po prostu usuwam te, które są dziurami (które, jak sądzę, powinieneś być w stanie zrobić, pozbywając się wszystkich figur, które są całkowicie zawarte przez inne, lub dziury mogą być zgodne z konwencją posiadania albo w prawo lub współrzędne przeciwne do ruchu wskazówek zegara, nie wiem ..), jeśli wszystko pójdzie dobrze, powinieneś pozostawić pojedynczą, całkowicie wypełnioną geometrię.
Drugą opcją byłoby ponowne wywołanie "GetFlattenedPathGeometry" na dowolnej ścieżce wypadkowej, aby uzyskać wielokątne przybliżenie ścieżki (bez krzywej, łuku, elipsy, itp.), Aby uzyskać ścieżka zawierająca tylko punkty i linie). Następnie wystarczy połączyć wszystkie wypadkowe liczby/segmenty w jedną figurę, której segmenty są uporządkowane zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara.
Testowałem oba podejścia i wydaje się, że działają one z co najmniej prostym przykładem testowym opisanym powyżej, ale nie będą działać z bardziej złożonymi kształtami (samoprzecinającymi się, wklęsłymi itp.) .. wsparcie, którego wymagam. więc pozostaje pytanie, jak to zrobić?
EDIT 3:
Tutaj jest bardziej skomplikowana geometria, w których kolejkowanie/łączenie staje się coraz trudniejsze:
<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>
która produkuje:
Dziękuję za odpowiedź. Przez "zamknięcie otworu" masz na myśli otwór w wypełnieniu lub niewielki odstęp między sąsiadującymi geometriami? Jeśli masz na myśli lukę między geometriami, niedługo opublikuję edycję za pomocą prostego przykładu CombinedGeometry, który wydaje się mieć ten sam problem, gdy pociągnięcia sąsiednich geometrii nakładają się na siebie i są połączone z połączeniem. Dzięki jeszcze raz! – Craig
Chętnie pomogę. Chodziło mi o duży obszar, który próbujesz wypełnić, a nie małą szczelinę między sąsiednimi geometriami. Jak pokazuje Twój edytowany eksperyment, połączenie wielu kształtów nie eliminuje dziury. Nie mogłem znaleźć żadnej funkcjonalności w ramach WPF, która identyfikowałaby i usuwała otwory zamknięte w styku lub zachodzące na siebie geometrie. Twoje podejście polegające na łączeniu geometrii i usuwaniu postaci, które są całkowicie zamknięte, brzmi jak świetny początek. – Scott