0:00:06.769,0:00:10.259 Добро утро, днес ще си говорим за вектори 0:00:10.937,0:00:12.877 Имам дълъг списък с видеота за правене 0:00:13.351,0:00:17.051 Ще разгледаме синтаксиса на PVector, основни математически операции с вектори, 0:00:17.450,0:00:21.010 Ще разгледаме нещо наречено ускорение, където ще видим законът на Нютон, сили 0:00:21.293,0:00:28.114 Накрая на тази поредица от видеота, съдържаща 5-6 или 7 видеота, ще имаме физически двигател (англ. - physics engine) 0:00:28.114,0:00:32.818 Ще симулираме физически тела от заобикалящия ни свят, реагиращи на физически сили 0:00:32.818,0:00:33.747 Доста вълнуващо 0:00:33.747,0:00:44.223 Какво ще правим? Единствената цел на това видео е да се запознаем със синтаксиса на PVector 0:00:44.223,0:00:45.789 Какво имам в предвид под PVector? 0:00:50.959,0:00:53.200 PVector-ът е клас в библиотеката Processing. 0:01:01.166,0:01:03.492 Има много готови класове в Processing 0:01:03.492,0:01:09.003 които описват например картинка, шрифт и различни видове обекти 0:01:09.003,0:01:11.947 Това е нещо, с което се надявам че сте запознати 0:01:11.947,0:01:13.257 ако сте използвали Processing 0:01:13.898,0:01:15.751 Днес ще научим за нов клас, наречен PVector 0:01:15.751,0:01:18.780 PVector-ът ще съдържа в себе си компонентите 0:01:18.780,0:01:19.805 на един вектор 0:01:19.805,0:01:21.200 Ако помните от предишното видео 0:01:21.260,0:01:22.680 Векторът, който може да бъде представен 0:01:22.930,0:01:25.920 като стрелка или посока (към коя страна векторът сочи?) 0:01:25.920,0:01:28.191 дължина (колко е дълъг векторът?) 0:01:32.061,0:01:34.683 Векторът има 'х' компонент и 'у' компонент 0:01:34.921,0:01:37.741 В интерес на истината PVector-ът пази в себе си 0:01:37.966,0:01:40.596 и 'z' компонент, но за целите на това видео 0:01:40.635,0:01:41.945 ще го игнорираме 0:01:56.570,0:01:58.310 Трябва да разясним какво представлява математиката 0:01:58.310,0:01:59.590 засягаща векторите 0:01:59.840,0:02:01.390 Какво означава да събираме вектори? 0:02:01.471,0:02:03.971 Ще видим умножение, деление, скаларно произведение 0:02:04.249,0:02:07.219 Да търсим дължина, да намираме единични вектори 0:02:08.323,0:02:10.093 Но първо, бих искал да разгледам нещо просто 0:02:10.995,0:02:13.165 Представете си, че имаме програма 0:02:13.690,0:02:16.560 Която има 'х' и 'у' променливи 0:02:17.617,0:02:20.467 Бихме искали да държим 'х'-те и 'у'-те 0:02:20.969,0:02:24.139 заедно в един векторен обект 0:02:25.927,0:02:30.487 Бихме могли да кажем PVector location (местоположение) 0:02:46.820,0:02:48.580 Вместо да имам отделни променливи за 'х' и 'у' 0:02:48.634,0:02:50.164 ще създадем един PVector 0:02:56.424,0:03:00.894 присвояваме стойност PVector на променливата location 0:03:02.462,0:03:05.792 със аргументи 100 50 например 0:03:12.604,0:03:14.514 Добре, какво точно се случва тук? 0:03:14.885,0:03:16.115 Примитивна промнелива 0:03:16.421,0:03:17.341 името и е 'х' 0:03:17.620,0:03:19.180 типът и е 'float' 0:03:19.677,0:03:21.147 Обектна променлива 0:03:21.358,0:03:22.298 името и е 'location' 0:03:22.491,0:03:23.711 типът на променливата е PVector 0:03:23.795,0:03:25.535 Какъвто и обект да направим 0:03:25.563,0:03:28.853 Например топка или риба 0:03:31.503,0:03:32.623 Казваме направи нова топка 0:03:32.762,0:03:33.572 или направи нова риба 0:03:33.690,0:03:34.490 направи ново балонче 0:03:35.008,0:03:36.518 Инстанцираме този обект 0:03:36.518,0:03:38.658 Правиме същото и с PVector 0:03:41.424,0:03:44.374 Казваме, 'location' е нова инстанция на PVector обекта 0:03:44.374,0:03:47.804 и конструктора взема 2 или 3 аргумента 0:03:47.804,0:03:50.814 В нашият случай, използваме двуизмерни вектори 0:03:50.814,0:03:53.354 за това използваме 2 аргумента 0:04:05.723,0:04:08.463 Нека разгледаме конкретен пример 0:04:11.386,0:04:16.116 Тук имаме стандартен пример за употребата на Processing 0:04:16.116,0:04:18.036 имаме скица на подскачаща топка 0:04:18.036,0:04:19.826 имаме обект-топка 'b' 0:04:19.883,0:04:21.223 Правим си нова топка 0:04:21.223,0:04:23.703 топката се движи и подскача 0:04:25.627,0:04:29.397 но нека разгледаме прозореца на топката 0:04:29.397,0:04:31.137 Тук са съществените неща 0:04:31.137,0:04:33.517 имаме 'х', 'у', 'xspeed' (speed - скорост) и 'yspeed' 0:04:33.517,0:04:35.907 Тук трябва да променим кода си, така че 0:04:35.907,0:04:37.577 да използваме вектори 0:04:45.068,0:04:49.068 Ще заместим 'х' и 'у' със PVector 'location' 0:04:50.567,0:04:53.087 и ще изтрием двете променливи 0:04:53.887,0:04:56.457 Сега, имаме още една двойка от 'х' и 'у' 0:04:57.888,0:05:00.308 Знаеме от функцията move(), че 'xspeed' променя 'х' 0:05:00.308,0:05:01.638 'уspeed' променя 'у' 0:05:01.750,0:05:04.140 Ще направим същото нещо, но със вектори 0:05:04.140,0:05:08.390 Вместо 'xspeed' и 'yspeed', ще напишем PVector и ще го кръстим 0:05:08.390,0:05:09.650 'velocity' (скорост) 0:05:09.650,0:05:12.710 Оказва се че скоростта е ключова идея 0:05:12.710,0:05:15.130 Която ще вградим нашият physics engine 0:05:15.327,0:05:17.087 Ако даден обект има позиция 0:05:17.274,0:05:20.574 Промяната на тази позиция спрямо времето е скоростта на обекта 0:05:20.600,0:05:24.730 Скоростта е вектор, който ни казва как позицията на обекта 0:05:24.730,0:05:26.700 се изменя в дадени моменти от време 0:05:33.783,0:05:35.476 Нека разгледаме конструктора 0:05:35.476,0:05:38.165 Инициализирахме 'х' и 'у' отделно 0:05:38.945,0:05:40.188 Сега ще го направим с вектори 0:05:40.188,0:05:41.383 със същите стойности 0:05:59.862,0:06:08.222 Виждате че заменяме всяка двойка променливи с един вектор 0:06:23.484,0:06:26.234 Тън-тън-тън-тън-тън-тън-тъъъъ! 0:06:55.379,0:06:58.609 Вместо две променливи, като всяка една от тях се променя 0:06:58.609,0:07:00.559 със съотвената си скорост 0:07:01.538,0:07:03.668 сега имаме една променлива, променяйки се от 'velocity' 0:07:06.052,0:07:07.872 Какво би могло да се обърка? 0:07:09.505,0:07:10.525 Нека го пуснем 0:07:12.409,0:07:13.409 Не знам дали виждате 0:07:15.853,0:07:22.983 Операторът '+' е недефиниран за вектори 0:07:25.693,0:07:26.583 Побърква се 0:07:27.474,0:07:29.224 Какво се случва тук? 0:07:29.714,0:07:31.064 Сега ще се наложи да спрем за малко 0:07:31.064,0:07:32.454 и да се върнем на дъската 0:07:34.836,0:07:37.266 Нека размишляваме върху това какво означава 0:07:37.266,0:07:38.476 операторът + 0:07:38.476,0:07:42.016 Знаем че използването на + във програмирането работи доста често 0:07:46.774,0:07:47.534 Това работи 0:07:50.213,0:07:53.663 Бихме могли дори събираме низове (string) 0:07:55.749,0:07:57.999 Какво представлява '+' в този контекст? 0:07:58.042,0:07:59.982 Представлява конкатенация (слепване) 0:07:59.982,0:08:01.242 получаваме 'abcd' 0:08:01.242,0:08:02.812 + в контекста на числата означава събиране 0:08:02.830,0:08:05.560 + в контекста на низовете означава конкатенация 0:08:05.560,0:08:08.780 Какво става когато се опитаме да съберем вектори 0:08:18.206,0:08:22.416 Реалността е, че просто не можем да правим подобно нещо 0:08:25.298,0:08:26.118 Би било хубаво 0:08:26.118,0:08:30.118 Има други програмни езици, които биха ни позволили 0:08:30.118,0:08:34.118 да използваме '+' операторът върху векторите 9:59:59.000,9:59:59.000 За съжаление Processing знае как да събира вектори, 9:59:59.000,9:59:59.000 толкова колкото знае как да събира шрифтове 9:59:59.000,9:59:59.000 или картинка със картинка 9:59:59.000,9:59:59.000 Събирането е позволено само за примитивни числа 9:59:59.000,9:59:59.000 и низове 9:59:59.000,9:59:59.000 За да съберем тези два вектора 9:59:59.000,9:59:59.000 Ще ни е нужно да използваме методи от PVector класа 9:59:59.000,9:59:59.000 Тези методи са add(), sub(), mult() 9:59:59.000,9:59:59.000 Много са 9:59:59.000,9:59:59.000 Във следващото видео ще разгледаме някои от тези методи 9:59:59.000,9:59:59.000 и математика зад тях 9:59:59.000,9:59:59.000 За сега ще се задоволим само със събиране на вектори 9:59:59.000,9:59:59.000 имахме 'х' и 'хspeed' 9:59:59.000,9:59:59.000 Сега имаме 9:59:59.000,9:59:59.000 Ще ги съкратя 9:59:59.000,9:59:59.000 Сега имаме 'loc' (местоположение) и 'vel' (скорост) 9:59:59.000,9:59:59.000 Можем да използваме по-кратката версия '+=' 9:59:59.000,9:59:59.000 караме компютъра да добави 'xspeed' към 'х' 9:59:59.000,9:59:59.000 и го запази в 'х' 9:59:59.000,9:59:59.000 Това означава, вземи този вектор 9:59:59.000,9:59:59.000 и го прибави към другия (loc) 9:59:59.000,9:59:59.000 Ще разгледаме подробностите зад събирането на вектори 9:59:59.000,9:59:59.000 във следващото видео 9:59:59.000,9:59:59.000 Сега вече знаем, че правилният подход е 9:59:59.000,9:59:59.000 да използваме метода аdd 9:59:59.000,9:59:59.000 Сега ще го пуснем и ... 9:59:59.000,9:59:59.000 дава му грешка защото използва 'х', който изтрихме 9:59:59.000,9:59:59.000 През по-голямата част от времето, искаме да правим 9:59:59.000,9:59:59.000 неща като тези 9:59:59.000,9:59:59.000 Искаме да манипулираме векторите като цяло 9:59:59.000,9:59:59.000 Не искаме да навлизаме в компонентите им 9:59:59.000,9:59:59.000 Сравнение: искаме просто да караме колата, 9:59:59.000,9:59:59.000 и когато я караме не искаме да я управляваме чрез жиците и 9:59:59.000,9:59:59.000 'х' и 'у' компонентите са еквивалента на жиците 9:59:59.000,9:59:59.000 в този обект 9:59:59.000,9:59:59.000 Но понякога се налага 9:59:59.000,9:59:59.000 Това тук е такъв случай 9:59:59.000,9:59:59.000 Сменяме навсякъде старите променливи с новите 9:59:59.000,9:59:59.000 Не е много вълнуващо 9:59:59.000,9:59:59.000 Просто използваме подобаващо х и у компонентите 9:59:59.000,9:59:59.000 на тези вектори 9:59:59.000,9:59:59.000 Когато се опитваме да изобразим даден обект на екрана 9:59:59.000,9:59:59.000 със сигурност ще се наложи да изпозлваме 9:59:59.000,9:59:59.000 индивидуалните компоненти 9:59:59.000,9:59:59.000 Всичките функции за изобразяване на форми 9:59:59.000,9:59:59.000 в Processing изискват позиция по х оста 9:59:59.000,9:59:59.000 и позиция по у оста 9:59:59.000,9:59:59.000 Не можем да кажем нарисувай ми елипса 9:59:59.000,9:59:59.000 само с този PVector обект 9:59:59.000,9:59:59.000 Би трябвало да проработи 9:59:59.000,9:59:59.000 Имаме си двата вектора 9:59:59.000,9:59:59.000 Инициализираме ги в конструктора 9:59:59.000,9:59:59.000 Във функцията move() 9:59:59.000,9:59:59.000 скоростта се добавя към местоположението 9:59:59.000,9:59:59.000 И това го правим всеки кадър 9:59:59.000,9:59:59.000 и го рисуваме 9:59:59.000,9:59:59.000 Работи 9:59:59.000,9:59:59.000 Това е краят на това видео 9:59:59.000,9:59:59.000 Бих ви предложил, преди да продължите към следващото 9:59:59.000,9:59:59.000 е да намерите някоя ваша скица 9:59:59.000,9:59:59.000 която има хиксове и у-ци навсякъде 9:59:59.000,9:59:59.000 и просто се опитайте 9:59:59.000,9:59:59.000 да я пренапишете, използвайки вектори 9:59:59.000,9:59:59.000 без да променяте функционалността 9:59:59.000,9:59:59.000 опитайте се да използвате някои от функциите 9:59:59.000,9:59:59.000 от PVector класа 9:59:59.000,9:59:59.000 но не се притеснявайте за тях 9:59:59.000,9:59:59.000 тъй като ще ги разгледаме в следващото видео