Нелінійні поверхні і кольорові гами

Візуалізація графіків функцій двох змінних виду z = f (x, y) - часто виникає практичне завдання. Крім того, ці нелінійні поверхні бувають неймовірно цікавих, красивих форм. Їх дослідження саме по собі - вкрай цікавий і повчальний процес. Будувати графіки функцій двох змінних на комп'ютері можна різними способами. В одному з минулих номерів "КВ" вже обговорювалося це питання. Тоді мова йшла про тоновой візуалізації з використанням різних градацій сірого кольору. Монохромні зображення володіють своїм неповторним шармом, якоїсь внутрішньої загадковістю. Недарма багатьом людям чорно-білі знімки подобаються більше, ніж кольорові, а чорно-біла фотографія зберігає свої позиції в високому фотомистецтві незважаючи ні на які вишукування науково-технічного прогресу. Проте, колір - найпотужніше образотворче засіб. Якщо при візуалізації графіка функції z = f (x, y) скористатися не чорно-білої, а кольоровий палітрою, то інформативність такого зображення різко зросте.

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

Як відомо, будь-який колір формується на екрані монітора всього з трьох "чистих" колірних компонент - червоного (Red), зеленого (Green) і синього (Blue). Кожен піксель, якщо розглядати екран через збільшувальне скло, складається з трьох зерняток червоного, зеленого і блакитного кольору. Ці зернятка можуть світитися з різною інтенсивністю. Залежно від яскравості світіння основних колірних компонент, окремі точки зливаються здалеку в різні однорідні кольору. Сучасне електронне обладнання (в режимі TrueColor) дозволяє варіювати яскравість світіння кожної з колірних компонент на 256 рівнях (від 0 до 255 одиниць). Таким чином, максимальна кількість можливих колірних комбінацій одно 256 * 256 * 256, що приблизно становить 16,7 мільйонів відтінків відтінків.

У нашому випадку для розмальовки графіка функції двох змінних z = f (x, y) використовуємо палітру, що містить різні суміші зеленого (G) і червоного (R) тонів. Глибокі западини на поверхні z будемо зафарбовувати темно-зеленим кольором, який у міру збільшення z буде поступово ставати все яскравіше, переходячи в яскраво-зелений, а потім в жовтий. При подальшому збільшенні z змусимо поверхню поступово червоніти. І, нарешті, найвищі "пагорби" на графіку будемо позначати темним криваво-червоним тоном.

Описане колірне рішення зображено на графіку.

Його суть полягає в наступному. Досліджуваний інтервал значень z від мінімуму до максимуму розбивається на чотири рівні частини. Всі точки зображуваної поверхні, в яких значення z менше заданого zmin, фарбуються в темно-зелений колір (G = 63). Далі, в першій чверті інтервалу, зелена компонента поступово зростає від 63 до 255. При цьому всі інші кольори зберігають свої нульові значення. У другій чверті зелена компонента зберігає максимальне значення, і поступово від 0 до 255 зростає яскравість червоного кольору. Таким чином, у другій чверті яскраво-зелений колір поступово переходить в яскраво-жовтий. У третій чверті яскравість зеленого кольору падає від 255 до 0, але червоний зберігає свою максимальну інтенсивність. У третій чверті яскраво-жовтий поступово переходить в чистий яскраво-червоний колір. І, нарешті, в останній четвертій чверті яскраво-червоний плавно "загасає" до похмурого темно-кривавого відтінку (R = 63). І далі все точки поверхні, в яких z приймає значення більше заданого zmax, фарбуються в темно-червоний колір.

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

Червоний Зелений Синій 0 63 0 0 127 0 0 191 0 0 255 0 63 255 0 127 255 0 191 255 0 255 255 0 255 191 0 255 127 0 255 63 0 255 0 0 191 0 0 127 0 0 63 0 0

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

Для побудови кольорових графіків функцій двох змінних легко може бути адаптована обговорювалася раніше програмна процедура тоновой візуалізації (див. "КВ" №29 ). Ось її модифікований варіант:

DefSng XZ Dim Zmin As Single Dim Zmax As Single Dim R As Single Dim R4 As Single Dim Z14 As Single Dim Z24 As Single Dim Z34 As Single Private Sub Screen_Click () Dim c As Long Dim n As Integer Dim hx As Single Dim hy As Single n = 405 Xmin = Text1 (0) .Text Xmax = Text1 (1) .Text Ymin = Text1 (2) .Text Ymax = Text1 (3) .Text Zmin = Text1 (4) .Text Zmax = Text1 (5) .Text R = Zmax - Zmin R4 = R / 4 Z14 = Zmin + R4 Z24 = Z14 + R4 Z34 = Z24 + R4 hx = (Xmax - Xmin) / n hy = (Ymax - Ymin) / ny = Ymin - hy / 2 For j = 0 To nx = Xmin - hx / 2 y = y + hy For i = 0 To nx = x + hx z = f (x, y) c = SetColor (z) Screen.PSet (i, j) , c Next i Next j End Sub Public Function f (x As Single, y As Single) As Single f = Sin ((y ^ 3 - x ^ 2) * (x - x * y)) End Function Public Function SetColor ( z As Single) As Long Dim t As Byte Select Case z Case Is <Zmin SetColor = "RGB (0," 63, 0) Case Zmin To Z14 t = "63" + 192 * (z Zmin) / R4 SetColor = " RGB (0, "t, 0) Case Z14 To Z24 t =" 255 "* (z Z14) / R4 SetColor =" RGB (t, "255, 0) Case Z 24 To Z34 t = "255" * (1 (z Z24) / R4) SetColor = "RGB (255," t, 0) Case Z34 To Zmax t = "63" + 192 * (1 (z Z34) / R4 ) SetColor = "RGB (t," 0, 0) Case Is> Zmax SetColor = RGB (63, 0, 0) End Select End Function

На початку програми доданий розрахунок величини і кордонів підінтервалів, необхідних для подальших обчислень. Замість простого визначення інтенсивності сірого тону в поточній точці в програму додана функція обчислення кольору SetColor (z). Кольорове зображення, отримане за допомогою даної модифікованої процедури, наведено на малюнку.

Оскільки "КВ" виходить в чорно-білому форматі, читачам доведеться повірити мені на слово, або відтворити описані обчислення на своїх комп'ютерах самостійно. Упевнений, що, чи не полінившись все це виконати, ви будете винагороджені сторицею за свою працю відкрилися перед вашим поглядом кольоровими красотами віртуального світу математичної нелінійності. Якщо ж хтось із вас знайде час поділитися результатами своїх знахідок і експериментів з кольором і математикою, - надсилайте ... Дякую всім читачів, які надіслали мені свої питання, міркування і пропозиції в минулому році. Всі вони не залишаться без уваги.

Андрій КОЛЕСНІКОВ, [email protected]