Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

kniga

.pdf
Скачиваний:
224
Добавлен:
17.05.2015
Размер:
29.65 Mб
Скачать

 

 

 

cosϕ

sin ϕ

0

0

 

 

 

 

 

 

 

 

 

 

 

 

R

(ϕ)=

sin ϕ

cosϕ

0

0

 

.

z

 

0

0

1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

1

 

 

 

 

 

 

 

 

2) Поворот одержаної системи координат відносно осі абсцис на

кут (

π

ψ) у напрямку від z до y. Матриця повороту має вигляд

 

 

 

 

 

 

2

 

1

 

0

 

 

0

 

 

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

0

0

0

 

 

 

 

 

 

 

0

cos(π ψ )

sin(π ψ )

0

 

 

 

 

π

 

 

 

 

 

0

sinψ

cosψ

0

 

 

R(

ψ ) =

 

 

2

 

 

2

 

 

 

 

=

 

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

2

 

 

0

sin(

π

ψ )

cos(

π

ψ )

0

 

 

0

cosψ

sinψ

0

 

 

 

2

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

0

1

 

 

 

 

 

 

 

0

 

0

 

 

0

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

z

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

z

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ψ

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ϕ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

y

 

Рис. 14.1. Перетворення системи координат

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Перетворення системи координат xyz у xyzзадається добутком

матриць Rz(ϕ) Rx(π

ψ ) , тобто матрицею

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cosϕ sin ϕ sinψ

 

sin ϕ cosψ

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

cosϕ sinψ

cosϕ cosψ

0

 

 

 

 

 

 

 

 

 

 

 

sin ϕ

 

 

(14.1)

 

 

 

 

 

A =

0

cosψ

 

 

sinψ

 

 

0

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

0

 

 

 

 

 

0

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Це означає, що точка (x, y, z) з поверхні переходить у точку (x, y) на картинній площині, де

x= xcosϕ + ysinϕ,

y= –xsinϕ sinψ + ycosϕ sinψ + zcosψ. (14.2)

Обернене перетворення задається матрицею A–1 = Aтр, тобто співвідношеннями

261

x = xcosϕ ysinϕ sinψ + zcosψ sinϕ,

 

y = xsinϕ + ysinψ cosϕ zcosψ cosϕ,

(14.3)

z = ycosψ + zsinψ.

 

Здійснивши заміну змінних (14.3) в рівнянні F(x, y, z) = 0, одержуємо рівняння поверхні F(x, y, z) = 0 у новій системі координат xyz, в якій напрям ортогонального проектування вже паралельний до осі zі проектування ведеться на площину xy. Надалі координати x, y, zпозначатимемо через x, y, z.

Алгоритм поточного горизонту працює в просторі зображення. Головна ідея методу полягає в зведенні тривимірної задачі до двовимірної шляхом перетину вихідної поверхні послідовністю паралельних площин, що мають постійне значення однієї з координат. Іншими словами, для створення зображення поверхні застосовується полігональний спосіб побудови графіка: функція наближається прямокутною матрицею значень функції у вузлах сітки, а сам графік поверхні задається набором ламаних ліній, що відповідають постійним значенням z та x.

Розглянемо спочатку побудову графіка функції у вигляді набору ліній, що відповідають постійним значенням z. Поверхня F(x, y, z) = 0 в цьому випадку апроксимується послідовністю кривих y = f(x, z), де z = const.

Для кожного z, що змінюється в циклі від z1 до zn, z1 < zn, перебираємо значення x з деякого діапазону і так знаходимо точки (x, y, z), що лежать на поверхні. Це означає, що написати програму побудови графіка функції двох змінних без усунення невидимих ліній нескладно, однак таке зображення поверхні буде досить незрозумілим. Тому постає задача побудови такої поверхні, на якій би усувались невидимі лінії.

Шляхом перетину поверхні послідовністю паралельних площин z = zi (і = 1, 2, ..., n) тривимірну задачу зводимо до двовимірної: поверхня представляється послідовністю ліній y = f(x, zi), які лежать у паралельних площинах z = zi і, як наслідок, не перетинаються (рис. 14.2).

Отже, маємо такий алгоритм побудови графіка функції y = f(x, z). Для кожної площини z = zi, у порядку зростання z, починаючи з найближчої до точки спостереження, малюються лінії. При зображенні поточної лінії виводиться лише та її частина, яка не закривається раніше намальованими лініями.

Якщо в деякій площині z = const, при деякому x одержуємо точку y, більшу за всі попередні y, то поточна крива видима в цій точці, інакше – невидима. Для визначення тих частин лінії y = f(x, zi), які не закриваються раніше намальованими лініями, вводяться в розгляд дві лінії горизонту – верхня та нижня (два масиви, довжина яких дорівнює кількості

262

точок х у просторі зображення). У цих масивах зберігатимуться поточні значення горизонтів.

y

z

zi

y = f(x, zi)

x

Рис. 14.2. Апроксимація поверхні лініями

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

Друга лінія теж повністю виводиться, а лінії горизонту корегуються так: нижня лінія горизонту в усіх своїх точках x прирівнюється до мінімуму серед значень y для двох уже виведених ліній, а верхня лінія горизонту – до максимуму. Область екрана між верхньою та нижньою лінією горизонту є проекцією частини графіка функції y = f(x, z) у смузі z1< z < z2.

Для інших ліній y = f(x, zi) при i > 2 ті частини ліній, які при проектуванні попадають в область між двома лініями горизонту, невидимі (при цьому способі проектування). Ця область заборонена для подальшого втручання. Наступна лінія буде малюватися лише для тих x, для яких її проекція лежить зовні області, що задається двома лініями горизонту. Тобто алгоритм тепер такий: якщо при деякому x значення y на поточній кривій більше за відповідне значення верхнього горизонту, то точка y видима, якщо менше за значення нижнього горизонту, то точка y теж видима, інакше – невидима.

Позначимо проекцію лінії y = f(x, zi) на картинну площину через y = yi(x), де (x, y) – координати точок лінії на картинній площині, тоді

контурні лінії горизонтів

ykmax (x) і

ykmin (x) на k-му кроці визначаються

співвідношеннями:

 

ykmin (x) = min yi (x) .

ykmax (x) = max

yi (x) ,

1ik 1

 

1ik 1

На k-му кроці малюються тільки ті частини лінії y = yk(x), які знаходяться вище лінії ykmax (x), або нижче лінії ykmin (x). Якщо ykmin (x) yk(x)

ykmax (x), то точка на поверхні невидима і вона не відображається. Такий

263

алгоритм і називається методом поточного горизонту. На рис. 14.3, а

наведено приклад поверхні побудованої цим методом. Для порівняння наведено зображення без усунення невидимих ліній (рис. 14.3, б)

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

а

б

Рис. 14.3. Поверхня z = f (x, y) = cos(b x2 + y2 ) .

1 + c x2 + y2

264

Зауваження 1. Якщо при деякому x значення y(x) невідоме, то для визначення y(x) потрібно використовувати інтерполяцію (можна ліній-

ну). У випадках, коли при xn точка yn видима, а при xn+k точка yn+k невидима, необхідно визначити частину видимої лінії, що проходить через

точки (xn, yn) і (xn+k, yn+ k), тобто необхідно знати точки перетину сегмента поточної лінії і ліній горизонту (рис. 14.4).

 

yn

 

xn

 

 

yn + k

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

xn +

k

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 14.4. Визначення

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 14.5. Випадні піксели

 

видимої частини лінії

 

z = 3

 

 

 

А

В

С

 

Зауваження 2. Випадок відріз-

 

 

 

 

 

 

 

 

 

ків ламаної з кутовим коефіцієн-

z = 2

 

 

 

А

В

С

 

том, за модулем, більшим одини-

 

 

 

 

 

 

 

 

 

ці, вимагає спеціальної обробки

z = 1

 

 

 

 

 

 

 

 

відрізків, щоб не з’являлися випад-

 

 

 

 

 

 

 

 

ні пікселі (рис. 14.5).

Рис. 14.6. Дефект алгоритму при

Зауваження 3. Якщо функція

задана малою кількістю точок і

 

 

 

 

наявності піків

 

має досить гострі піки, то наве-

дений алгоритм може дати некоректні результати. Наприклад, розглянемо випадок ліній, що зображені на рис. 14.6. Оскільки лінія z = 3 у точках А та В видима, то можна зробити висновок, що відрізок АВ (z = 3) видимий, хоча це не так, бо цей відрізок частково перекривається піком лінії z = 1.

Для лінії z = 2 будуть знаходитися видимі частини відрізків АВ та ВС, позаяк один із кінців відрізка видимий, а другий – невидимий. Для лінії z=3 алгоритм працює неправильно, для лінії z = 2 – правильно.

Наведений алгоритм дає дефект, коли поточна крива може з’явитися зліва або справа від попередніх кривих. Наприклад, на рис. 14.7 криві z = 1, z = 2 видимі, але при x [2, 5) верхнім горизонтом є крива z = 2 і для кривої z = 3 координати y менші, ніж значення верхнього горизонту, отже, видимі. Тобто при x = 4 алгоритм визначає криву z = 3 видимою, тому виникають зазубрини. Цього дефекту можна уникнути шляхом уведення в масиви верхнього та нижнього горизонтів ординат, що відпові-

265

дають штриховим лініям, які утворюються хибними бічними ребрами. Введення лівого хибного ребра P1P3 для випадку рис. 14.7 зробить

лінію z = 3 при x [3, 5) невидимою. Хибне ребро не вводиться, якщо крайні точки на кривих z = 1, z = 2 мають однакові значення координати x. Аналогічно вводяться у розгляд праві хибні бічні ребра.

y

z =3

P3

z =2

z =1

P1

0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

1

2

3

4

5

6

7

8

 

 

 

Рис. 14.7. Введення хибних бічних ребер

14.3. Алгоритм Робертса

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

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

Вхідні дані. Об’єкт задається списком вершин, тобто номерами вершин та їхніми координатами, і списком ребер об’єкта (масив RIB) у світовій системі координат. Окрім цього, для побудови перспективної проекції, потрібно задати координати точки E спостерігача (рис. 14.8).

Вважаємо, що центр об’єкта знаходиться в початку світової системи координат, інакше потрібно виконати переміщення об’єкта. Щоб одержати координати вершин у видовій системі координат, необхідно здійснити видове перетворення. Видові координати вершин зберігатимемо в масиві VER. z-координати цих вершин (VER[i].z) повинні бути більшими

266

за нуль або дорівнювати нулю. Якщо ці значення менші за нуль, то необхідно зупинити програму. Надалі оперуватимемо тільки координатами у видовій системі координат.

z

y

x

E

z

y

x

Рис. 14.8. Видові координати

Для цього алгоритму кожну грань об’єкта розбивають на трикутники (щоб програма була простішою, програміст сам розбиває граньна трикутники). Ці трикутники будуть використовуватися для з’ясування того, чи закривають вони відрізки прямих ліній. При цьому номери вершин у кожному трикутнику задаються в такій послідовності, щоб вони складали поворот проти годинникової стрілки, якщо дивитися на об’єкт

зовні.

Список трикутників вигідно запам’ятати в деякому масиві – назвемо його TRIANGLE, кожний елемент якого матиме структуру

A B C a b c h,

де A, B, C – номери точок, що утворюють трикутник, а числа a, b, c, h – коефіцієнти рівняння площини ax + by + cz = h, в якій розміщений цей трикутник.

Коефіцієнти a, b, c, h обчислюються з рівняння площини

x

y

z

1

 

xA

yA

zA

1

= 0.

xB

yB

zB

1

xC

yC

zC

1

 

Тобто

a =

yA

zA

1

, b =

xA

zA

1

, c =

xA

yA

1

, h =

xA

yA

zA

.

yB

zB

1

xB

zB

1

xB

yB

1

xB

yB

zB

 

yC

zC

1

 

xC

zC

1

 

xC

yC

1

 

xC

yC

zC

 

Розглянемо проекції точок A, B, C на картинну площину. Відомо, що координати перспективної проекції точки А на площину z = d знаходяться за формулами

xA =

dxA

 

yA =

dyA

 

zA

,

zA .

 

 

Напрям обходу точок-проекцій може бути встановлений на основі аналізу визначника

267

 

 

 

 

 

 

 

 

 

 

 

xA

yA

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

D =

xB

yB

1

 

.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

Оскільки

 

 

 

 

 

xC

yC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dx A

 

dy A

1

 

 

xA

yA

zA

 

 

 

 

 

 

 

 

 

 

 

z A

 

z A

 

 

 

 

 

 

 

 

hd

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

dx B

 

dy B

 

= d

2

 

 

 

 

 

 

 

 

 

 

 

D =

 

 

1

xB

yB

zB

 

 

/ (zA zB zC) = zA zB zC , zA, zB, zC > 0,

 

z B

 

z B

 

 

 

 

 

dx c

 

dy c

 

1

 

 

xC

yC

zC

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

z c

z c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

то D і h однакового знаку. Тоді можливі такі випадки:

1)якщо h = 0, то площина ABC проходить через точку E і ABC нічого не закриває;

2)якщо h < 0 (рівносильно D < 0), то ABC – задній, тому що при D < 0 маємо обхід проекцій точок A, B, C за годинниковою стрілкою (напрям обходу змінився). Задні трикутники теж ігноруються, оскільки вони закриваються видимими гранями. Зауважимо, що у випадку одного опуклого многогранника виділення задніх трикутників повністю розв’я- зує задачу усунення невидимих граней. Для складних графічних сцен цей факт часто використовується для усунення нелицьових граней перед

 

 

 

P

застосуванням інших алгоритмів усу-

 

 

B

нення невидимих ліній та граней;

 

 

R

3) якщо h > 0, то ABC

 

 

 

 

 

 

Q

записуємо в масив TRIANGLE, тому

 

 

R

що він належить до передніх граней

E

A

 

об’єкта.

 

 

C

Розробимо алгоритм визначення

 

 

 

 

невидимих ліній, тобто алгоритм,

Рис. 14.9. Видимість точки R

який викреслюватиме тільки видимі

частини відрізків PQ зі списку ребер

RIB.

Для цього потрібно виконати перевірку для кожного ABC зі списку в масиві TRIANGLE, щоб з’ясувати, чи буде ABC закривати все ребро PQ, чи його частину.

Нехай E – точка зору. Кажуть, що ABC загороджує точку R PQ, якщо відрізок ER перетинає ABC у внутрішній точці Rтрикутника і у внутрішній точці R відрізка PQ (рис. 14.9).

Точки границі ABC і граничні точки P, Q не вважаємо внутрішніми. Отже, точка R не загороджується ABC, якщо

268

 

1) точка R′ ∆ ABC,

 

 

 

 

 

2) точка Rграниці ABC.

 

 

 

 

 

Якщо точка R не загороджується ABC, то точка R називається

видимою відносно ABC. Якщо із відрізка PQ відносно ABC видно

скінченну кількість точок, то будемо говорити, що ABC загороджує

ребро PQ. ABC частково закриває PQ, якщо він закриває нескінченно

 

Q

багато точок відрізка PQ і вод-

 

ночас нескінченно багато точок

 

C

 

є видимими відносно ABC.

 

J

Якщо

ABC

закриває

E

B

відрізок PQ, то PQ закритий і не

 

I

повинен зображатися. При цьо-

 

A

му немає необхідності викону-

 

 

 

P

вати перевірку для решти три-

 

кутників.

 

 

 

 

Рис. 14.10. Піраміда видимості

 

 

 

 

 

 

 

 

Розглянемо алгоритм визначення видимості відрізка PQ відносно ABC. Нагадаємо, що ми вже маємо видові координати для п’яти точок

P, Q, A, B, C.

Побудуємо нескінченну піраміду, вершина якої знаходиться в точці E, а бічні грані проходять через сторони трикутника ABC (рис. 14.10).

Все, що знаходиться всередині піраміди позаду ABC, є невидимим, а всі точки, що лежать зовні піраміди або в піраміді перед ABC, видимі відносно ABC.

Розглянемо питання перетину відрізка PQ із гранями піраміди. Рівняння прямої PQ запишемо у вигляді

x = xP + λ(xQ xP),

y = yP + λ(yQ yP), (14.4)

z = zP + λ(yQ zP).

Точка I належить площині AEB, рівняння якої має вигляд

 

x

y

z

= 0,

 

 

xA

yA

zA

 

 

xB

yB

zB

 

 

або

 

 

 

 

C1x + C2y + C3z = 0,

(14.5)

де C1 = yAzB zAyB, C2 = xBzA xAzB, C3 = xAyB yAxB.

 

Підставляючи (14.5) в (14.4), знаходимо

 

269

λ =

 

 

C1xP + C2 yP + C3 zP

 

 

 

 

 

.

(14.6)

C (x

x

P

) + C

( y

Q

y

P

) + C

(z

Q

z

P

)

 

1 Q

 

2

 

 

3

 

 

 

 

 

Знаючи λ, з (14.4) можна знайти координати точки I (точки перетину відрізка PQ з гранню AEB). Якщо λ [0, 1], то точка I лежить на відрізку PQ, для інших значень λ точка I не належить відрізкуPQ.

Але не можна стверджувати, що якщо λ [0, 1], то відрізок PQ перетинає піраміду (справедливе лише обернене твердження), оскільки перетин відрізка PQ може відбутися з площиною, в якій лежить грань AEB.

Щоб переконатися, що точка I належить грані AEB, проведемо пло-

щину PEQ і дізнаємось, чи ця площина перетинає відрізок AB.

 

Аналогічно сказаному вище, запишемо рівняння прямої AB

 

 

 

 

x = xA + µ(xB xA),

 

 

 

 

 

 

 

 

 

 

 

y = yA + µ(yB yA),

 

 

 

 

 

 

 

(14.7)

 

 

 

z = zA + µ(yB zA)

 

 

 

 

 

 

 

 

та рівняння площини PEQ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

де

 

K1x + K2y + K3z = 0,

 

 

 

 

 

 

 

(14.8)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

K1 = yPzQ yQzP, K2 = xQzP xPzQ,

K3 = xPyQ xQyP.

 

Із рівнянь (14.7), (14.8) знаходимо

 

 

 

 

 

 

 

 

 

 

µ =

 

 

 

K1xA + K2 yA + K3 zA

 

 

 

 

 

 

.

(14.9)

K (x

B

x

A

) + K

2

( y

B

y

A

) + K

3

(z

B

z

A

)

1

 

 

 

 

 

 

 

 

 

 

Отже, відрізок PQ і грань AEB піраміди мають спільну точку I тоді і тільки тоді, коли

0 λ 1, 0 µ 1.

Аналогічно досліджується перетин відрізка PQ з іншими гранями

BEC, AEC.

Відрізок PQ може не мати або мати один чи два перетини з пірамідою. Відповідно точки P, Q лежатимуть всередині, зовні піраміди або безпосередньо на піраміді.

Такі перевірки потрібно виконувати для кожної пари відрізок-три- кутник, а це вимагає великих обчислювальних затрат. З метою зменшення кількості перевірок бажано починати алгоритм з аналізу таких випадків, які не вимагають значних затрат машинного часу.

Опишемо цей алгоритм у вигляді тестів. При успішному виконанні одного з тестів наступні тести не перевіряються.

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

270

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]