Добро утро, днес ще си говорим за вектори
Имам дълъг списък с видеота за правене
Ще разгледаме синтаксиса на PVector, основни математически операции с вектори,
Ще разгледаме нещо наречено ускорение, където ще видим законът на Нютон, сили
Накрая на тази поредица от видеота, съдържаща 5-6 или 7 видеота, ще имаме физически двигател (англ. - physics engine)
Ще симулираме физически тела от заобикалящия ни свят, реагиращи на физически сили
Доста вълнуващо
Какво ще правим? Единствената цел на това видео е да се запознаем със синтаксиса на PVector
Какво имам в предвид под PVector?
PVector-ът е клас в библиотеката Processing.
Има много готови класове в Processing
които описват например картинка, шрифт и различни видове обекти
Това е нещо, с което се надявам че сте запознати
ако сте използвали Processing
Днес ще научим за нов клас, наречен PVector
PVector-ът ще съдържа в себе си компонентите
на един вектор
Ако помните от предишното видео
Векторът, който може да бъде представен
като стрелка или посока (към коя страна векторът сочи?)
дължина (колко е дълъг векторът?)
Векторът има 'х' компонент и 'у' компонент
В интерес на истината PVector-ът пази в себе си
и 'z' компонент, но за целите на това видео
ще го игнорираме
Трябва да разясним какво представлява математиката
засягаща векторите
Какво означава да събираме вектори?
Ще видим умножение, деление, скаларно произведение
Да търсим дължина, да намираме единични вектори
Но първо, бих искал да разгледам нещо просто
Представете си, че имаме програма
Която има 'х' и 'у' променливи
Бихме искали да държим 'х'-те и 'у'-те
заедно в един векторен обект
Бихме могли да кажем PVector location (местоположение)
Вместо да имам отделни променливи за 'х' и 'у'
ще създадем един PVector
присвояваме стойност PVector на променливата location
със аргументи 100 50 например
Добре, какво точно се случва тук?
Примитивна промнелива
името и е 'х'
типът и е 'float'
Обектна променлива
името и е 'location'
типът на променливата е PVector
Какъвто и обект да направим
Например топка или риба
Казваме направи нова топка
или направи нова риба
направи ново балонче
Инстанцираме този обект
Правиме същото и с PVector
Казваме, 'location' е нова инстанция на PVector обекта
и конструктора взема 2 или 3 аргумента
В нашият случай, използваме двуизмерни вектори
за това използваме 2 аргумента
Нека разгледаме конкретен пример
Тук имаме стандартен пример за употребата на Processing
имаме скица на подскачаща топка
имаме обект-топка 'b'
Правим си нова топка
топката се движи и подскача
но нека разгледаме прозореца на топката
Тук са съществените неща
имаме 'х', 'у', 'xspeed' (speed - скорост) и 'yspeed'
Тук трябва да променим кода си, така че
да използваме вектори
Ще заместим 'х' и 'у' със PVector 'location'
и ще изтрием двете променливи
Сега, имаме още една двойка от 'х' и 'у'
Знаеме от функцията move(), че 'xspeed' променя 'х'
'уspeed' променя 'у'
Ще направим същото нещо, но със вектори
Вместо 'xspeed' и 'yspeed', ще напишем PVector и ще го кръстим
'velocity' (скорост)
Оказва се че скоростта е ключова идея
Която ще вградим нашият physics engine
Ако даден обект има позиция
Промяната на тази позиция спрямо времето е скоростта на обекта
Скоростта е вектор, който ни казва как позицията на обекта
се изменя в дадени моменти от време
Нека разгледаме конструктора
Инициализирахме 'х' и 'у' отделно
Сега ще го направим с вектори
със същите стойности
Виждате че заменяме всяка двойка променливи с един вектор
Тън-тън-тън-тън-тън-тън-тъъъъ!
Вместо две променливи, като всяка една от тях се променя
със съотвената си скорост
сега имаме една променлива, променяйки се от 'velocity'
Какво би могло да се обърка?
Нека го пуснем
Не знам дали виждате
Операторът '+' е недефиниран за вектори
Побърква се
Какво се случва тук?
Сега ще се наложи да спрем за малко
и да се върнем на дъската
Нека размишляваме върху това какво означава
операторът +
Знаем че използването на + във програмирането работи доста често
Това работи
Бихме могли дори събираме низове (string)
Какво представлява '+' в този контекст?
Представлява конкатенация (слепване)
получаваме 'abcd'
+ в контекста на числата означава събиране
+ в контекста на низовете означава конкатенация
Какво става когато се опитаме да съберем вектори
Реалността е, че просто не можем да правим подобно нещо
Би било хубаво
Има други програмни езици, които биха ни позволили
да използваме '+' операторът върху векторите
За съжаление Processing знае как да събира вектори,
толкова колкото знае как да събира шрифтове
или картинка със картинка
Събирането е позволено само за примитивни числа
и низове
За да съберем тези два вектора
Ще ни е нужно да използваме методи от PVector класа
Тези методи са add(), sub(), mult()
Много са
Във следващото видео ще разгледаме някои от тези методи
и математика зад тях
За сега ще се задоволим само със събиране на вектори
имахме 'х' и 'хspeed'
Сега имаме
Ще ги съкратя
Сега имаме 'loc' (местоположение) и 'vel' (скорост)
Можем да използваме по-кратката версия '+='
караме компютъра да добави 'xspeed' към 'х'
и го запази в 'х'
Това означава, вземи този вектор
и го прибави към другия (loc)
Ще разгледаме подробностите зад събирането на вектори
във следващото видео
Сега вече знаем, че правилният подход е
да използваме метода аdd
Сега ще го пуснем и ...
дава му грешка защото използва 'х', който изтрихме
През по-голямата част от времето, искаме да правим
неща като тези
Искаме да манипулираме векторите като цяло
Не искаме да навлизаме в компонентите им
Сравнение: искаме просто да караме колата,
и когато я караме не искаме да я управляваме чрез жиците и
'х' и 'у' компонентите са еквивалента на жиците
в този обект
Но понякога се налага
Това тук е такъв случай
Сменяме навсякъде старите променливи с новите
Не е много вълнуващо
Просто използваме подобаващо х и у компонентите
на тези вектори
Когато се опитваме да изобразим даден обект на екрана
със сигурност ще се наложи да изпозлваме
индивидуалните компоненти
Всичките функции за изобразяване на форми
в Processing изискват позиция по х оста
и позиция по у оста
Не можем да кажем нарисувай ми елипса
само с този PVector обект
Би трябвало да проработи
Имаме си двата вектора
Инициализираме ги в конструктора
Във функцията move()
скоростта се добавя към местоположението
И това го правим всеки кадър
и го рисуваме
Работи
Това е краят на това видео
Бих ви предложил, преди да продължите към следващото
е да намерите някоя ваша скица
която има хиксове и у-ци навсякъде
и просто се опитайте
да я пренапишете, използвайки вектори
без да променяте функционалността
опитайте се да използвате някои от функциите
от PVector класа
но не се притеснявайте за тях
тъй като ще ги разгледаме в следващото видео