Xamarin.Forms Tvary: vyplnit pravidla

Ukázka stažení Stažení ukázky

Několik Xamarin.Forms tříd Shapes má FillRule vlastnosti typu FillRule . Mezi ně patří Polygon , Polyline a GeometryGroup .

FillRuleVýčet definuje EvenOdd a Nonzero členy. Každý člen představuje jiné pravidlo, které určuje, zda je bod v oblasti výplně obrazce.

Důležité

Všechny tvary jsou pro účely pravidel vyplňování považovány za uzavřené.

EvenOdd

EvenOddPravidlo Fill nakreslí prostor z bodu na nekonečno v jakémkoli směru a spočítá počet segmentů v rámci tvaru, který je v daném poli. Pokud je toto číslo liché, je bod uvnitř. Pokud je toto číslo i tak, že je tento bod mimo.

Následující příklad XAML vytvoří a vykreslí složený tvar s FillRule výchozí hodnotou EvenOdd :

<Path Stroke="Black"
      Fill="#CCCCFF"
      Aspect="Uniform"
      HorizontalOptions="Start">
    <Path.Data>
        <!-- FillRule doesn't need to be set, because EvenOdd is the default. -->
        <GeometryGroup>
            <EllipseGeometry RadiusX="50"
                             RadiusY="50"
                             Center="75,75" />
            <EllipseGeometry RadiusX="70"
                             RadiusY="70"
                             Center="75,75" />
            <EllipseGeometry RadiusX="100"
                             RadiusY="100"
                             Center="75,75" />
            <EllipseGeometry RadiusX="120"
                             RadiusY="120"
                             Center="75,75" />
        </GeometryGroup>
    </Path.Data>
</Path>

V tomto příkladu se zobrazí složený tvar, který se skládá z řady soustředné prstence:

Složený tvar se

Ve složeném obrazci si všimněte, že se neplní střed a třetí prstence. Důvodem je to, že Ray nakreslený z libovolného bodu v jednom z těchto dvou kroužků projde sudým počtem segmentů:

Složený tvar s poznámkami s poznámkou výplně EvenOdd

Na obrázku výše označují červené kroužky body a řádky prezentují libovolné paprsky. V horním bodě dva libovolné paprsky vycházejí z sudého počtu segmentů čáry. Proto prstenec, ve kterém je bod, není vyplněn. Pro spodní bod dva libovolné paprsky přecházejí z lichého počtu segmentů čáry. Proto je obsazený kroužek, v němž je bod v.

Nenulovou

NonzeroPravidlo Fill nakreslí prostor z bodu na nekonečno v jakémkoli směru a pak prochází místa, kde segment tvaru protíná ray. Počínaje nulovým počtem se počet zvýší na každé, když segment převyšuje ray od zleva doprava a snížený pokaždé, když segment převyšuje Ray z zprava doleva. Pokud je výsledek nula, je po počítání křížení ukazatel mimo mnohoúhelník. V opačném případě je uvnitř.

Následující příklad XAML vytvoří a vykreslí složený tvar s FillRule nastavením na Nonzero :

<Path Stroke="Black"
      Fill="#CCCCFF"
      Aspect="Uniform"
      HorizontalOptions="Start">
    <Path.Data>
        <GeometryGroup FillRule="Nonzero">
            <EllipseGeometry RadiusX="50"
                             RadiusY="50"
                             Center="75,75" />
            <EllipseGeometry RadiusX="70"
                             RadiusY="70"
                             Center="75,75" />
            <EllipseGeometry RadiusX="100"
                             RadiusY="100"
                             Center="75,75" />
            <EllipseGeometry RadiusX="120"
                             RadiusY="120"
                             Center="75,75" />
        </GeometryGroup>
    </Path.Data>
</Path>

V tomto příkladu se zobrazí složený tvar, který se skládá z řady soustředné prstence:

Diagram zobrazuje čtyři soustředné kruhy, které jsou vyplněny.

V složeném tvaru si všimněte, že jsou vyplněny všechny prstence. Důvodem je to, že všechny segmenty jsou spuštěny ve stejném směru, takže v jednom z nich bude přecházet jeden nebo více segmentů a součet křížení se nerovná nule:

Diagram znázorňuje kružnice z předchozího diagramu se směrnou šipkou a Ray s poznámkou + 1 pro každý kruh, který předává.

Na obrázku nad červenými šipkami představuje směr vykreslování segmentů a černá šipka představuje libovolný Ray běžící od bodu v nejvnitřnějším prstenci. Počínaje hodnotou nula se pro každý segment, který je paprskový, přidá hodnota jednoho, protože segment přechází z levého na pravé.

Složitější tvar se segmenty spuštěnými v různých směrech je nutný k lepšímu znázornění chování Nonzero pravidla výplně. Následující příklad XAML vytvoří podobný tvar na předchozí příklad s tím rozdílem, že je vytvořen pomocí a PathGeometry nikoli EllipseGeometry :

<Path Stroke="Black"
      Fill="#CCCCFF">
     <Path.Data>
         <GeometryGroup FillRule="Nonzero">
             <PathGeometry>
                 <PathGeometry.Figures>
                     <!-- Inner ring -->
                     <PathFigure StartPoint="120,120">
                         <PathFigure.Segments>
                             <PathSegmentCollection>
                                 <ArcSegment Size="50,50"
                                             IsLargeArc="True"
                                             SweepDirection="CounterClockwise"
                                             Point="140,120" />
                             </PathSegmentCollection>
                         </PathFigure.Segments>
                     </PathFigure>

                     <!-- Second ring -->
                     <PathFigure StartPoint="120,100">
                         <PathFigure.Segments>
                             <PathSegmentCollection>
                                 <ArcSegment Size="70,70"
                                             IsLargeArc="True"
                                             SweepDirection="CounterClockwise"
                                             Point="140,100" />
                             </PathSegmentCollection>
                         </PathFigure.Segments>
                     </PathFigure>

                     <!-- Third ring  -->
                         <PathFigure StartPoint="120,70">
                         <PathFigure.Segments>
                             <PathSegmentCollection>
                                 <ArcSegment Size="100,100"
                                             IsLargeArc="True"
                                             SweepDirection="CounterClockwise"
                                             Point="140,70" />
                             </PathSegmentCollection>
                         </PathFigure.Segments>
                     </PathFigure>

                     <!-- Outer ring -->
                     <PathFigure StartPoint="120,300">
                         <PathFigure.Segments>
                             <ArcSegment Size="130,130"
                                         IsLargeArc="True"
                                         SweepDirection="Clockwise"
                                         Point="140,300" />
                         </PathFigure.Segments>
                     </PathFigure>
                 </PathGeometry.Figures>
             </PathGeometry>
         </GeometryGroup>
     </Path.Data>
 </Path>

V tomto příkladu jsou vykresleny řady segmentů oblouku, které nejsou uzavřeny:

Diagram zobrazuje čtyři soustředné kroužky, které jsou nejvíce a třetí z nejvzdálenějšího vyplněného.

Na obrázku výše je třetí oblouk ze středu nevyplněn. Důvodem je skutečnost, že součet hodnot z daného pole v daném poli v cestě je nula:

Diagram znázorňuje kružnice z předchozího diagramu se směrnou šipkou a dvěma paprsky s poznámkami + 1 nebo-1 pro každý kruh, který přecházejí.

Na obrázku výše červené kolečko představuje bod, černé čáry představují libovolné paprsky, které přecházejí z bodu v neprázdné oblasti a červené šipky představují směr vykreslování segmentů. Jak je vidět, součet hodnot z paprsků protínajících se segmenty je nula:

  • Libovolný Ray, který se v diagonálním směru přenáší, protíná dva segmenty, které běží v různých směrech. Proto segmenty vzájemně zruší další předání hodnoty nula.
  • Libovolný Ray, který prochází úhlopříčně vlevo, překračuje celkem šest segmentů. U ostatních se však ostatní zruší, takže nula je konečným součtem.

Součet nulových výsledků v okruhu není vyplněn.