Dziś dokończenie (ale nie zakończenie) tematu grafiki 2D w WPF. Zaczniemy od omówienia Geometries. Tak więc zaczynamy.

Geometries

To sposób na wyabstrahowanie kształtu lub ścieżki dostępne w WPF. Co mamy dostępne?

  • RectangleGeometry – pozwala na tworzenie (tak, tak) prostokątów, także z zaokrąglonymi rogami

  • EllipseGeometry – elipsy i okręgi

  • LineGeometry – wszelkiej maści odcinki

  • PathGemoetry – wszystko co powyżej i jeszcze wiele więcej

Ten ostatni przypadek, omówimy sobie dokładniej, gdyż jest najbardziej złożony.

PathGeometry

PathGeometry składa się z jednego lub więcej PathFigure a ten z kolei składa się z PathSegment. Rodzajów segmentów mamy 7 i są to: LineSegment, PolyLineSegment, ArcSegment, BezierSegment, PolyBezierSegment, QuadriaticBezierSegment oraz PolyQadraticBezierSegment. Jak tego użyć?

<GeometryDrawing>

    <GeometryDrawing.Geometry>

        <PathGeometry>

            <PathFigure>

                <LineSegment Point=”0,100″ />

                <LineSegment Point=”100,100″ />

            PathFigure>

            <PathFigure>                                       

                <ArcSegment Point=”100,100″ RotationAngle=”0″ Size=”100,100″ />

            PathFigure>

        PathGeometry>

    GeometryDrawing.Geometry>

    <GeometryDrawing.Pen>

        <Pen Thickness=”5″ Brush=”Black” />

    GeometryDrawing.Pen>

GeometryDrawing>

Dodatkowo w prosty sposób możemy naszą figurę wypełnić kolorem. Wystarczy na elemencie GeometryDrawing ustawić właściwość Brush.

<GeometryDrawing Brush=”Pink”>

Możemy też w bardzo prosty sposób sprawić, aby nasz obiekt był domknięty. Właściwość IsClosed

<PathFigure IsClosed=”True”>

Mając już tak “skomplikowaną” strukturę możemy pobawić się trochę sposobem wypełniania. Steruje tym parametr FillRule. Domyślną wartością jest EvenOdd i obszar jest zapełniany jeśli przekroczona by była nieparzysta liczba segmentów na drodze do tego segmentu. Działanie tego trybu można zobaczyć na obrazku powyżej. Tryb NonZero jest bardziej złożony i w większości przypadków wypełniona będzie cała figura. Przykład działania NonZero

Dodatkowo za pomocą właściwości IsSmoothJoin możemy kontrolować w jaki sposób linie są ze sobą połączone.

Wydajność

Tworzenie elementów za pomocą XAML’a nie jest najwydajniejszym sposobem. Jeśli ktoś chce uzyskać większą wydajność, a raz utworzonych struktur nie ma potrzeby zmieniać warto popatrzeć na StreamGeometry.

Agregacje

Dostępne są dwie: GeometryGroup oraz CombinedGeometry. Ta pierwsza pozwala dodatkowo na ustawienie kilku właściwości naraz do wielu klas Geometry. Ten ostatni pozwala na przeprowadzenie kilku operacji na swoich elementach. Tryb ustawiamy za pomocą właściwości GeometryCombinedMode a dostępne tryby to: Union, Intersect, Xor oraz Exclude. Przykład użycia:

<GeometryDrawing.Geometry>

    <CombinedGeometry GeometryCombineMode=”Intersect”>

        <CombinedGeometry.Geometry1>

            <PathGeometry FillRule=”Nonzero”>

                <PathFigure IsClosed=”True”>

                    <LineSegment Point=”0,100″/>

                    <LineSegment Point=”100,100″ />

                PathFigure>

            PathGeometry>

        CombinedGeometry.Geometry1>

        <CombinedGeometry.Geometry2>

            <PathGeometry>

                <PathFigure>

                    <ArcSegment Point=”100,100″ RotationAngle=”0″ Size=”100,100″ />

                PathFigure>

            PathGeometry>

        CombinedGeometry.Geometry2>

    CombinedGeometry>

GeometryDrawing.Geometry>

Polecam po eksperymentować z tymi klasami. Można uzyskać ciekawe efekty.

W następnej części pokażemy jak można tworzyć klasy Geometry za pomocą łańcuchów znaków.