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