Розділ 1. Вектори
Я вчиняю злочини спрямовано і велично.
— Вектор, Нікчемний Я

Паличкова мапа — це навігаційний інструмент, створений корінним населенням Маршаллових островів, розташованих у центральній частині Тихого океану. Цей стародавній інструмент був виготовлений з ретельно зв’язаних середніх жилок кокосових листків. Мушлі на мапі вказують на розташування островів у регіоні. Розташування листків і мушель слугує географічним орієнтиром, пропонуючи абстрактне представлення векторів, які фіксують патерни хвилювання океану і їх напрямок.
Ця книга присвячена вивченню навколишнього нас світу і розробці способів його симуляції за допомогою коду. Першу частину книги я почну з розгляду основ фізики: як яблуко падає з дерева, як маятник коливається на повітрі, як земля обертається навколо сонця тощо. Абсолютно все, що міститься в перших п’яти розділах книги, вимагає використання найпростішого будівельного блоку для програмування руху — вектора. Саме з цього я і розпочну нашу подорож.
Слово вектор може означати багато речей. Це і назва рок-гурту нової хвилі, сформованого на початку 1980-х років в Сакраменто, штат Каліфорнія, і назва пластівців для сніданку, вироблених компанією Kellogg’s Canada. В області епідеміології вектор — це організм, який передає інфекцію від одного господаря до іншого. У мові програмування C++ вектор (std::vector
) є імплементацією структури даних масиву, що динамічно змінює свій розмір.
Хоча всі ці визначення певною мірою цікаві, вони тут поза увагою. Натомість цей розділ розглядає евклідів вектор (названий на честь грецького математика Евкліда), також відомий як геометричний вектор. Коли ви бачите у цій книзі термін вектор, можете вважати, що він стосується евклідового вектора, визначеного як сутність, яка має магнітуду (величину) і напрямок.

Вектор зазвичай малюється у вигляді стрілки, як на малюнку 1.1. Напрямок вектора вказується вістрям стрілки, а його величина — довжиною цієї стрілки.
Вектор на малюнку 1.1 зображений у вигляді стрілки від точки до точки . Він служить інструкцією, як рухатися від до .
Суть векторів
Перш ніж заглибитися в подробиці векторів, я хотів би створити приклад на p5.js, який в першу чергу демонструє, чому ви повинні бути зацікавлені у векторах. Якщо ви переглядали будь-які початкові уроки з p5.js, читали якісь матеріали для початківців з p5.js або проходили вступ до курсу творчого кодування (сподіваюся, ви зробили щось із цього, щоб підготуватися до цієї книги!), ви ймовірно, в той чи інший момент, навчилися програмувати кульку, що відплигує від стінок.
let x = 100;
let y = 100;
let xspeed = 2.5;
let yspeed = 2;
function setup() {
createCanvas(640, 240);
}
function draw() {
background(255);
x = x + xspeed;
y = y + yspeed;
Переміщення кульки відповідно до її швидкості.
if (x > width || x < 0) {
xspeed = xspeed * -1;
}
if (y > height || y < 0) {
yspeed = yspeed * -1;
}
Перевірка кульки на дотик до стінок.
stroke(0);
fill(127);
circle(x, y, 48);
Малювання кульки у вигляді круга за координатами (x, y).
}
У цьому прикладі є плаский 2D світ — порожнє полотно з кулькою, яка по ньому рухається. Ця кулька має такі властивості, як положення та швидкість, які представлені в коді окремими змінними:
Властивість | Назви змінних |
---|---|
Положення | x і y |
Швидкість | xspeed і yspeed |
У складнішому прикладі ви можете мати набагато більше змінних, що представляють інші властивості кульки та її середовища:
Властивість | Назви змінних |
---|---|
Прискорення | xacceleration і yacceleration |
Цільове положення | xtarget і ytarget |
Вітер | xwind і ywind |
Тертя | xfriction і yfriction |
Ви можете помітити, що для кожного концепту в цьому світі (вітру, положення, прискорення тощо) є дві змінні. І це лише 2D світ. У 3D-світі для кожної властивості вам знадобляться вже три змінні: x
, y
і z
для представлення положення, xspeed
, yspeed
та zspeed
для швидкості й так далі. Хіба не було б добре спростити код, використовуючи менше змінних? Замість того, щоб починати програму з чогось такого:
let x;
let y;
let xspeed;
let yspeed;
я волів би почати її з чогось подібного:
let position;
let speed;
Розгляд властивостей кульки у вигляді векторів, замість розпорошеного набору окремих значень, дозволить мені зробити це.
Зробивши цей перший крок до використання векторів, ви не отримаєте щось суттєво нове і ваша p5.js програма не перетвориться чарівним чином на повноцінну фізичну симуляцію. Однак використання векторів допоможе організувати ваш код і надасть набір методів для типових математичних операцій, які вам знадобляться знову і знову і знову при програмуванні руху.
У вступі до векторів я збираюся дотримуватися двовимірного їх представлення (принаймні у перших кількох розділах). Усі ці приклади можна досить легко розширити до трьох вимірів і клас p5.Vector
, який я буду використовувати, має таку можливість. Однак, при вивченні основ, додаткове ускладнення з третім виміром відвертатиме увагу від основної мети.
Вектори у p5.js
Подумайте про вектор як про різницю між двома точками або як інструкцію для переходу від однієї точки до іншої. Наприклад, на малюнку 1.2 показано деякі вектори та їх можливі інтерпретації.

Ці вектори можна розглядати наступним чином:
Вектор | Інструкції |
---|---|
Пройдіть 15 кроків на захід, а потім 3 кроки на північ. | |
Пройдіть 3 кроки на схід, а потім 4 кроки на північ. | |
Пройдіть 2 кроки на схід, а потім 1 крок на південь. |
Можливо, ви вже думали про це таким чином, коли програмували рух. Для кожного кадру анімації (одна ітерація функції draw()
у p5.js) ви вказуєте кожному об’єкту перемістити себе в нове місце на певну кількість пікселів по горизонталі та певну кількість пікселів по вертикалі. Ця інструкція по суті є вектором, як на малюнку 1.3. Він має магнітуду (як далеко ви рухалися) і напрямок (яким шляхом ви йшли).

Змінні для положення і швидкості кульки.