Wpf, polyline і polygon

Клас Polyline дозволяє малювати послідовність пов'язаних відрізків прямих. У цьому випадку просто поставляється список координат X і Y з використанням властивості Points. Формально властивість Points вимагає об'єкта PointCollection, але ця колекція заповнюється в XAML-розмітці за допомогою лаконічного строкового синтаксису. Потрібно просто поставити список точок, описаних координатами з роздільниками (пропуском або комою) між ними.

Елемент Polyline може бути описаний лише двома точками. Наприклад, нижче наведено приклад фігури Polyline, дублюючої лінію, яка простягається від (5,100) до (15,200):

А ось більш складний об'єкт Polyline, що починається в точці (10,150). Точки монотонно розподіляються зліва направо, коливаючись між найбільшим значенням і найменшим:

Отримана в результаті лінія показана на малюнку:

Wpf, polyline і polygon

Тут може здатися, що було б простіше наповнити колекцію Points програмно з використанням деякого циклу, автоматично збільшує значення X і Y. Це вірно, якщо потрібно створювати динамічну графіку - наприклад, діаграму, яка змінює свою форму в залежності від інформації, витягнутої з бази даних. Але якщо просто потрібно побудувати фіксований фрагмент графічного вмісту, взагалі нема чого турбуватися про певні координатах фігур.

Замість цього для малювання відповідної графіки застосовується інструмент, подібний Expression Design, який дозволяє експортувати результуючу графіку в XAML-розмітку.

Клас Polygon - майже те ж саме, що і Polyline. Як і Polyline, клас Polygon визначає колекцію Points, приймаючу список координат. Єдина відмінність в тому, що Polygon додає фінальний сегмент, який з'єднує початкову та кінцеву точки. (Якщо фінальна точка вже збігається з початковою, то Polygon нічим від Polyline не відрізняється.) Внутрішню частину отриманої фігури можна заповнити з використанням кисті Fill:

Wpf, polyline і polygon

Формально можна також встановлювати властивість Fill для об'єкта Polyline. У цій ситуації Polyline зафарбовує себе так, як якщо б це був Polygon. Іншими словами, як якщо б він мав невидимий сегмент, який з'єднує кінцеву точку з початкової. Цей ефект знаходить відносно обмежене застосування.

У простій фігурі, де лінії ніколи не перетинаються, заповнити внутрішню область легко. Однак іноді доводиться мати справу з більш складним Polygon, де не зовсім очевидно, якісь частини знаходяться "всередині" фігури (і повинні бути зафарбовані), а які - зовні.

Наприклад, поглянемо на малюнок нижче, на якому представлена ​​лінія, яка перетинає більш жодній іншій лінії, залишаючи в центрі неправильну область, яку можна заповнити, а можна і не заповнювати. Очевидно, для визначення того, що саме потрібно зафарбовувати, можна розбити цей малюнок на кілька менших фігур. Але робити це зовсім не обов'язково.

Wpf, polyline і polygon

Кожен елемент Polygon і Polyline має властивість FillRule. яке дозволяє вибирати між двома різними підходами в заповненні областей. За замовчуванням FillRule встановлено в EvenOdd. Для того щоб вирішити, чи потрібно заповнювати область, WPF підраховує кількість ліній, які потрібно перетнути під час досягнення зовнішньої сторони фігури. Якщо це число непарне, область заповнюється, якщо ж парне - немає. Щоб потрапити в центральну область фігури на малюнку, знадобиться перетнути дві лінії, тому область і не зафарбовується.

У WPF також підтримується правило заповнення Nonzero, яке трохи складніше. За правилом Nonzero, WPF виконує такий же підрахунок ліній, як і в EventOdd, але при цьому бере до уваги напрямок кожної з ліній. Якщо кількість ліній, спрямованих в одну сторону (скажімо, зліва направо) дорівнює кількості ліній, спрямованих у протилежну сторону (справа наліво), область не заповнюється. Якщо різниця між цими двома кількостями не дорівнює нулю, область заповнюється. Якщо встановити властивість FillRule в Nonzero в фігурі з попереднього прикладу, внутрішня область заповниться.

Якщо кількість ліній непарне, то різниця між лічильниками не може бути дорівнює нулю. Тому правило Nonzero завжди призводить до заповнення, як мінімум, такого ж числа областей, що і правило EvenOdd, плюс, можливо, ще кілька.

Особливість правила Nonzero полягає в тому, що його налаштування заповнення залежать від того, яким чином малюється фігура, а не від того, як вона виглядає. Наприклад, ту ж саму фігуру можна намалювати так, що її центр не буде заповнений (хоча це і важче - можна почати малювати внутрішню область, а потім намалювати зовнішні промені в зворотному напрямку).