1 00:00:06,769 --> 00:00:10,259 Добро утро, днес ще си говорим за вектори 2 00:00:10,937 --> 00:00:12,877 Имам дълъг списък с видеота за правене 3 00:00:13,351 --> 00:00:17,051 Ще разгледаме синтаксиса на PVector, основни математически операции с вектори, 4 00:00:17,450 --> 00:00:21,010 Ще разгледаме нещо наречено ускорение, където ще видим законът на Нютон, сили 5 00:00:21,293 --> 00:00:28,114 Накрая на тази поредица от видеота, съдържаща 5-6 или 7 видеота, ще имаме физически двигател (англ. - physics engine) 6 00:00:28,114 --> 00:00:32,818 Ще симулираме физически тела от заобикалящия ни свят, реагиращи на физически сили 7 00:00:32,818 --> 00:00:33,747 Доста вълнуващо 8 00:00:33,747 --> 00:00:44,223 Какво ще правим? Единствената цел на това видео е да се запознаем със синтаксиса на PVector 9 00:00:44,223 --> 00:00:45,789 Какво имам в предвид под PVector? 10 00:00:50,959 --> 00:00:53,200 PVector-ът е клас в библиотеката Processing. 11 00:01:01,166 --> 00:01:03,492 Има много готови класове в Processing 12 00:01:03,492 --> 00:01:09,003 които описват например картинка, шрифт и различни видове обекти 13 00:01:09,003 --> 00:01:11,947 Това е нещо, с което се надявам че сте запознати 14 00:01:11,947 --> 00:01:13,257 ако сте използвали Processing 15 00:01:13,898 --> 00:01:15,751 Днес ще научим за нов клас, наречен PVector 16 00:01:15,751 --> 00:01:18,780 PVector-ът ще съдържа в себе си компонентите 17 00:01:18,780 --> 00:01:19,805 на един вектор 18 00:01:19,805 --> 00:01:21,200 Ако помните от предишното видео 19 00:01:21,260 --> 00:01:22,680 Векторът, който може да бъде представен 20 00:01:22,930 --> 00:01:25,920 като стрелка или посока (към коя страна векторът сочи?) 21 00:01:25,920 --> 00:01:28,191 дължина (колко е дълъг векторът?) 22 00:01:32,061 --> 00:01:34,683 Векторът има 'х' компонент и 'у' компонент 23 00:01:34,921 --> 00:01:37,741 В интерес на истината PVector-ът пази в себе си 24 00:01:37,966 --> 00:01:40,596 и 'z' компонент, но за целите на това видео 25 00:01:40,635 --> 00:01:41,945 ще го игнорираме 26 00:01:56,570 --> 00:01:58,310 Трябва да разясним какво представлява математиката 27 00:01:58,310 --> 00:01:59,590 засягаща векторите 28 00:01:59,840 --> 00:02:01,390 Какво означава да събираме вектори? 29 00:02:01,471 --> 00:02:03,971 Ще видим умножение, деление, скаларно произведение 30 00:02:04,249 --> 00:02:07,219 Да търсим дължина, да намираме единични вектори 31 00:02:08,323 --> 00:02:10,093 Но първо, бих искал да разгледам нещо просто 32 00:02:10,995 --> 00:02:13,165 Представете си, че имаме програма 33 00:02:13,690 --> 00:02:16,560 Която има 'х' и 'у' променливи 34 00:02:17,617 --> 00:02:20,467 Бихме искали да държим 'х'-те и 'у'-те 35 00:02:20,969 --> 00:02:24,139 заедно в един векторен обект 36 00:02:25,927 --> 00:02:30,487 Бихме могли да кажем PVector location (местоположение) 37 00:02:46,820 --> 00:02:48,580 Вместо да имам отделни променливи за 'х' и 'у' 38 00:02:48,634 --> 00:02:50,164 ще създадем един PVector 39 00:02:56,424 --> 00:03:00,894 присвояваме стойност PVector на променливата location 40 00:03:02,462 --> 00:03:05,792 със аргументи 100 50 например 41 00:03:12,604 --> 00:03:14,514 Добре, какво точно се случва тук? 42 00:03:14,885 --> 00:03:16,115 Примитивна промнелива 43 00:03:16,421 --> 00:03:17,341 името и е 'х' 44 00:03:17,620 --> 00:03:19,180 типът и е 'float' 45 00:03:19,677 --> 00:03:21,147 Обектна променлива 46 00:03:21,358 --> 00:03:22,298 името и е 'location' 47 00:03:22,491 --> 00:03:23,711 типът на променливата е PVector 48 00:03:23,795 --> 00:03:25,535 Какъвто и обект да направим 49 00:03:25,563 --> 00:03:28,853 Например топка или риба 50 00:03:31,503 --> 00:03:32,623 Казваме направи нова топка 51 00:03:32,762 --> 00:03:33,572 или направи нова риба 52 00:03:33,690 --> 00:03:34,490 направи ново балонче 53 00:03:35,008 --> 00:03:36,518 Инстанцираме този обект 54 00:03:36,518 --> 00:03:38,658 Правиме същото и с PVector 55 00:03:41,424 --> 00:03:44,374 Казваме, 'location' е нова инстанция на PVector обекта 56 00:03:44,374 --> 00:03:47,804 и конструктора взема 2 или 3 аргумента 57 00:03:47,804 --> 00:03:50,814 В нашият случай, използваме двуизмерни вектори 58 00:03:50,814 --> 00:03:53,354 за това използваме 2 аргумента 59 00:04:05,723 --> 00:04:08,463 Нека разгледаме конкретен пример 60 00:04:11,386 --> 00:04:16,116 Тук имаме стандартен пример за употребата на Processing 61 00:04:16,116 --> 00:04:18,036 имаме скица на подскачаща топка 62 00:04:18,036 --> 00:04:19,826 имаме обект-топка 'b' 63 00:04:19,883 --> 00:04:21,223 Правим си нова топка 64 00:04:21,223 --> 00:04:23,703 топката се движи и подскача 65 00:04:25,627 --> 00:04:29,397 но нека разгледаме прозореца на топката 66 00:04:29,397 --> 00:04:31,137 Тук са съществените неща 67 00:04:31,137 --> 00:04:33,517 имаме 'х', 'у', 'xspeed' (speed - скорост) и 'yspeed' 68 00:04:33,517 --> 00:04:35,907 Тук трябва да променим кода си, така че 69 00:04:35,907 --> 00:04:37,577 да използваме вектори 70 00:04:45,068 --> 00:04:49,068 Ще заместим 'х' и 'у' със PVector 'location' 71 00:04:50,567 --> 00:04:53,087 и ще изтрием двете променливи 72 00:04:53,887 --> 00:04:56,457 Сега, имаме още една двойка от 'х' и 'у' 73 00:04:57,888 --> 00:05:00,308 Знаеме от функцията move(), че 'xspeed' променя 'х' 74 00:05:00,308 --> 00:05:01,638 'уspeed' променя 'у' 75 00:05:01,750 --> 00:05:04,140 Ще направим същото нещо, но със вектори 76 00:05:04,140 --> 00:05:08,390 Вместо 'xspeed' и 'yspeed', ще напишем PVector и ще го кръстим 77 00:05:08,390 --> 00:05:09,650 'velocity' (скорост) 78 00:05:09,650 --> 00:05:12,710 Оказва се че скоростта е ключова идея 79 00:05:12,710 --> 00:05:15,130 Която ще вградим нашият physics engine 80 00:05:15,327 --> 00:05:17,087 Ако даден обект има позиция 81 00:05:17,274 --> 00:05:20,574 Промяната на тази позиция спрямо времето е скоростта на обекта 82 00:05:20,600 --> 00:05:24,730 Скоростта е вектор, който ни казва как позицията на обекта 83 00:05:24,730 --> 00:05:26,700 се изменя в дадени моменти от време 84 00:05:33,783 --> 00:05:35,476 Нека разгледаме конструктора 85 00:05:35,476 --> 00:05:38,165 Инициализирахме 'х' и 'у' отделно 86 00:05:38,945 --> 00:05:40,188 Сега ще го направим с вектори 87 00:05:40,188 --> 00:05:41,383 със същите стойности 88 00:05:59,862 --> 00:06:08,222 Виждате че заменяме всяка двойка променливи с един вектор 89 00:06:23,484 --> 00:06:26,234 Тън-тън-тън-тън-тън-тън-тъъъъ! 90 00:06:55,379 --> 00:06:58,609 Вместо две променливи, като всяка една от тях се променя 91 00:06:58,609 --> 00:07:00,559 със съотвената си скорост 92 00:07:01,538 --> 00:07:03,668 сега имаме една променлива, променяйки се от 'velocity' 93 00:07:06,052 --> 00:07:07,872 Какво би могло да се обърка? 94 00:07:09,505 --> 00:07:10,525 Нека го пуснем 95 00:07:12,409 --> 00:07:13,409 Не знам дали виждате 96 00:07:15,853 --> 00:07:22,983 Операторът '+' е недефиниран за вектори 97 00:07:25,693 --> 00:07:26,583 Побърква се 98 00:07:27,474 --> 00:07:29,224 Какво се случва тук? 99 00:07:29,714 --> 00:07:31,064 Сега ще се наложи да спрем за малко 100 00:07:31,064 --> 00:07:32,454 и да се върнем на дъската 101 00:07:34,836 --> 00:07:37,266 Нека размишляваме върху това какво означава 102 00:07:37,266 --> 00:07:38,476 операторът + 103 00:07:38,476 --> 00:07:42,016 Знаем че използването на + във програмирането работи доста често 104 00:07:46,774 --> 00:07:47,534 Това работи 105 00:07:50,213 --> 00:07:53,663 Бихме могли дори събираме низове (string) 106 00:07:55,749 --> 00:07:57,999 Какво представлява '+' в този контекст? 107 00:07:58,042 --> 00:07:59,982 Представлява конкатенация (слепване) 108 00:07:59,982 --> 00:08:01,242 получаваме 'abcd' 109 00:08:01,242 --> 00:08:02,812 + в контекста на числата означава събиране 110 00:08:02,830 --> 00:08:05,560 + в контекста на низовете означава конкатенация 111 00:08:05,560 --> 00:08:08,780 Какво става когато се опитаме да съберем вектори 112 00:08:18,206 --> 00:08:22,416 Реалността е, че просто не можем да правим подобно нещо 113 00:08:25,298 --> 00:08:26,118 Би било хубаво 114 00:08:26,118 --> 00:08:30,118 Има други програмни езици, които биха ни позволили 115 00:08:30,118 --> 00:08:34,118 да използваме '+' операторът върху векторите 116 99:59:59,999 --> 99:59:59,999 За съжаление Processing знае как да събира вектори, 117 99:59:59,999 --> 99:59:59,999 толкова колкото знае как да събира шрифтове 118 99:59:59,999 --> 99:59:59,999 или картинка със картинка 119 99:59:59,999 --> 99:59:59,999 Събирането е позволено само за примитивни числа 120 99:59:59,999 --> 99:59:59,999 и низове 121 99:59:59,999 --> 99:59:59,999 За да съберем тези два вектора 122 99:59:59,999 --> 99:59:59,999 Ще ни е нужно да използваме методи от PVector класа 123 99:59:59,999 --> 99:59:59,999 Тези методи са add(), sub(), mult() 124 99:59:59,999 --> 99:59:59,999 Много са 125 99:59:59,999 --> 99:59:59,999 Във следващото видео ще разгледаме някои от тези методи 126 99:59:59,999 --> 99:59:59,999 и математика зад тях 127 99:59:59,999 --> 99:59:59,999 За сега ще се задоволим само със събиране на вектори 128 99:59:59,999 --> 99:59:59,999 имахме 'х' и 'хspeed' 129 99:59:59,999 --> 99:59:59,999 Сега имаме 130 99:59:59,999 --> 99:59:59,999 Ще ги съкратя 131 99:59:59,999 --> 99:59:59,999 Сега имаме 'loc' (местоположение) и 'vel' (скорост) 132 99:59:59,999 --> 99:59:59,999 Можем да използваме по-кратката версия '+=' 133 99:59:59,999 --> 99:59:59,999 караме компютъра да добави 'xspeed' към 'х' 134 99:59:59,999 --> 99:59:59,999 и го запази в 'х' 135 99:59:59,999 --> 99:59:59,999 Това означава, вземи този вектор 136 99:59:59,999 --> 99:59:59,999 и го прибави към другия (loc) 137 99:59:59,999 --> 99:59:59,999 Ще разгледаме подробностите зад събирането на вектори 138 99:59:59,999 --> 99:59:59,999 във следващото видео 139 99:59:59,999 --> 99:59:59,999 Сега вече знаем, че правилният подход е 140 99:59:59,999 --> 99:59:59,999 да използваме метода аdd 141 99:59:59,999 --> 99:59:59,999 Сега ще го пуснем и ... 142 99:59:59,999 --> 99:59:59,999 дава му грешка защото използва 'х', който изтрихме 143 99:59:59,999 --> 99:59:59,999 През по-голямата част от времето, искаме да правим 144 99:59:59,999 --> 99:59:59,999 неща като тези 145 99:59:59,999 --> 99:59:59,999 Искаме да манипулираме векторите като цяло 146 99:59:59,999 --> 99:59:59,999 Не искаме да навлизаме в компонентите им 147 99:59:59,999 --> 99:59:59,999 Сравнение: искаме просто да караме колата, 148 99:59:59,999 --> 99:59:59,999 и когато я караме не искаме да я управляваме чрез жиците и 149 99:59:59,999 --> 99:59:59,999 'х' и 'у' компонентите са еквивалента на жиците 150 99:59:59,999 --> 99:59:59,999 в този обект 151 99:59:59,999 --> 99:59:59,999 Но понякога се налага 152 99:59:59,999 --> 99:59:59,999 Това тук е такъв случай 153 99:59:59,999 --> 99:59:59,999 Сменяме навсякъде старите променливи с новите 154 99:59:59,999 --> 99:59:59,999 Не е много вълнуващо 155 99:59:59,999 --> 99:59:59,999 Просто използваме подобаващо х и у компонентите 156 99:59:59,999 --> 99:59:59,999 на тези вектори 157 99:59:59,999 --> 99:59:59,999 Когато се опитваме да изобразим даден обект на екрана 158 99:59:59,999 --> 99:59:59,999 със сигурност ще се наложи да изпозлваме 159 99:59:59,999 --> 99:59:59,999 индивидуалните компоненти 160 99:59:59,999 --> 99:59:59,999 Всичките функции за изобразяване на форми 161 99:59:59,999 --> 99:59:59,999 в Processing изискват позиция по х оста 162 99:59:59,999 --> 99:59:59,999 и позиция по у оста 163 99:59:59,999 --> 99:59:59,999 Не можем да кажем нарисувай ми елипса 164 99:59:59,999 --> 99:59:59,999 само с този PVector обект 165 99:59:59,999 --> 99:59:59,999 Би трябвало да проработи 166 99:59:59,999 --> 99:59:59,999 Имаме си двата вектора 167 99:59:59,999 --> 99:59:59,999 Инициализираме ги в конструктора 168 99:59:59,999 --> 99:59:59,999 Във функцията move() 169 99:59:59,999 --> 99:59:59,999 скоростта се добавя към местоположението 170 99:59:59,999 --> 99:59:59,999 И това го правим всеки кадър 171 99:59:59,999 --> 99:59:59,999 и го рисуваме 172 99:59:59,999 --> 99:59:59,999 Работи 173 99:59:59,999 --> 99:59:59,999 Това е краят на това видео 174 99:59:59,999 --> 99:59:59,999 Бих ви предложил, преди да продължите към следващото 175 99:59:59,999 --> 99:59:59,999 е да намерите някоя ваша скица 176 99:59:59,999 --> 99:59:59,999 която има хиксове и у-ци навсякъде 177 99:59:59,999 --> 99:59:59,999 и просто се опитайте 178 99:59:59,999 --> 99:59:59,999 да я пренапишете, използвайки вектори 179 99:59:59,999 --> 99:59:59,999 без да променяте функционалността 180 99:59:59,999 --> 99:59:59,999 опитайте се да използвате някои от функциите 181 99:59:59,999 --> 99:59:59,999 от PVector класа 182 99:59:59,999 --> 99:59:59,999 но не се притеснявайте за тях 183 99:59:59,999 --> 99:59:59,999 тъй като ще ги разгледаме в следващото видео