-
Добро утро, днес ще си говорим за вектори
-
Имам дълъг списък с видеота за правене
-
Ще разгледаме синтаксиса на 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'
-
+ в контекста на числата означава събиране
-
+ в контекста на низовете означава конкатенация
-
Какво става когато се опитаме да съберем вектори
-
Реалността е, че просто не можем да правим подобно нещо
-
Би било хубаво
-
Има други програмни езици, които биха ни позволили
-
да използваме '+' операторът върху векторите
-
Not Synced
За съжаление Processing знае как да събира вектори,
-
Not Synced
толкова колкото знае как да събира шрифтове
-
Not Synced
или картинка със картинка
-
Not Synced
Събирането е позволено само за примитивни числа
-
Not Synced
и низове
-
Not Synced
За да съберем тези два вектора
-
Not Synced
Ще ни е нужно да използваме методи от PVector класа
-
Not Synced
Тези методи са add(), sub(), mult()
-
Not Synced
Много са
-
Not Synced
Във следващото видео ще разгледаме някои от тези методи
-
Not Synced
и математика зад тях
-
Not Synced
За сега ще се задоволим само със събиране на вектори
-
Not Synced
имахме 'х' и 'хspeed'
-
Not Synced
Сега имаме
-
Not Synced
Ще ги съкратя
-
Not Synced
Сега имаме 'loc' (местоположение) и 'vel' (скорост)
-
Not Synced
Можем да използваме по-кратката версия '+='
-
Not Synced
караме компютъра да добави 'xspeed' към 'х'
-
Not Synced
и го запази в 'х'
-
Not Synced
Това означава, вземи този вектор
-
Not Synced
и го прибави към другия (loc)
-
Not Synced
Ще разгледаме подробностите зад събирането на вектори
-
Not Synced
във следващото видео
-
Not Synced
Сега вече знаем, че правилният подход е
-
Not Synced
да използваме метода аdd
-
Not Synced
Сега ще го пуснем и ...
-
Not Synced
дава му грешка защото използва 'х', който изтрихме
-
Not Synced
През по-голямата част от времето, искаме да правим
-
Not Synced
неща като тези
-
Not Synced
Искаме да манипулираме векторите като цяло
-
Not Synced
Не искаме да навлизаме в компонентите им
-
Not Synced
Сравнение: искаме просто да караме колата,
-
Not Synced
и когато я караме не искаме да я управляваме чрез жиците и
-
Not Synced
'х' и 'у' компонентите са еквивалента на жиците
-
Not Synced
в този обект
-
Not Synced
Но понякога се налага
-
Not Synced
Това тук е такъв случай
-
Not Synced
Сменяме навсякъде старите променливи с новите
-
Not Synced
Не е много вълнуващо
-
Not Synced
Просто използваме подобаващо х и у компонентите
-
Not Synced
на тези вектори
-
Not Synced
Когато се опитваме да изобразим даден обект на екрана
-
Not Synced
със сигурност ще се наложи да изпозлваме
-
Not Synced
индивидуалните компоненти
-
Not Synced
Всичките функции за изобразяване на форми
-
Not Synced
в Processing изискват позиция по х оста
-
Not Synced
и позиция по у оста
-
Not Synced
Не можем да кажем нарисувай ми елипса
-
Not Synced
само с този PVector обект
-
Not Synced
Би трябвало да проработи
-
Not Synced
Имаме си двата вектора
-
Not Synced
Инициализираме ги в конструктора
-
Not Synced
Във функцията move()
-
Not Synced
скоростта се добавя към местоположението
-
Not Synced
И това го правим всеки кадър
-
Not Synced
и го рисуваме
-
Not Synced
Работи
-
Not Synced
Това е краят на това видео
-
Not Synced
Бих ви предложил, преди да продължите към следващото
-
Not Synced
е да намерите някоя ваша скица
-
Not Synced
която има хиксове и у-ци навсякъде
-
Not Synced
и просто се опитайте
-
Not Synced
да я пренапишете, използвайки вектори
-
Not Synced
без да променяте функционалността
-
Not Synced
опитайте се да използвате някои от функциите
-
Not Synced
от PVector класа
-
Not Synced
но не се притеснявайте за тях
-
Not Synced
тъй като ще ги разгледаме в следващото видео