Główna zawartość
Programowanie
Kurs: Programowanie > Rozdział 5
Lekcja 4: Wektory- Wprowadzenie do wektorów
- Wyzwanie: Twórca Wektorów
- Więcej matematyki wektorowej
- Wyzwanie: Miecz Świetlny
- Długość i normalizacja wektora
- Wyzwanie: Wizualizer wielkości
- Ruch wektorowy
- Wyzwanie: Hamujący Samochód
- Funkcje statyczne a metody instancyjne
- Wyzwanie: Funkcje statyczne
- Interaktywny ruch wektorowy
- Wyzwanie: Prześladowca myszki
- Projekt: Stworzenia obliczeniowe
© 2023 Khan AcademyWarunki użytkowaniapolitykę prywatnościInformacja o plikach cookie
Interaktywny ruch wektorowy
Aby zakończyć ten rozdział, spróbujmy czegoś odrobinę bardziej skomplikowanego i zdecydowanie przydatniejszego. Będziemy dynamicznie obliczać przyspieszenie obiektu zgodnie z regułą opisaną w Algorytmie 3 — obiekt przyspiesza w kierunku kursora.
Za każdym razem, gdy chcemy obliczyć wektor w oparciu o regułę lub wzór, musimy obliczyć dwie rzeczy: moduł i kierunek. Zacznijmy od kierunku. Wiemy, że wektor przyspieszenia powinien wskazywać od położenia obiektu na położenie kursora. Powiedzmy, że obiekt znajduje się w punkcie
(x,y)
, a kursor w (mouseX,mouseY)
.Z rysunku wynika, że możemy uzyskać wektor
(dx,dy)
poprzez odjęcie położenia obiektu od położenia kursora:dx = mouseX - x
dy = mouseY - y
Przepiszmy powyższe używając składni
PVector
. Zakładając, że jesteśmy w definicji obiektu Mover
i dzięki temu mamy dostęp do położenia obiektu PVector
, otrzymujemy:var mouse = new PVector(mouseX, mouseY);
// Look! We’re using the static sub() because we want a completely new PVector
var dir = PVector.sub(mouse, position);
Teraz mamy obiekt
PVector
, który wskazuje od położenia movera aż do kursora. Jeśli obiekt miałby przyspieszać zgodnie z tym wektorem, natychmiast pojawiłby się w położeniu kursora. Oczywiście nie czyni to dobrej animacji i to, co chcemy teraz zrobić, to zdecydować jak szybko ten obiekt powinien przyspieszać w stronę kursora.Aby ustawić moduł (jakikolwiek by był) naszego PVectora przyspieszenia, musimy najpierw ___ ten wektor kierunkowy. Właśnie tak, powiedziałeś to. Znormalizować. Jeśli możemy zmniejszyć wektor do jego wektora jednostkowego (o długości równej jeden), to mamy wektor, który mówi nam o kierunku i może być łatwo przeskalowany do każdej wartości. Jeden pomnożone przez cokolwiek daje cokolwiek.
var anything = ??;
dir.normalize();
dir.mult(anything);
Podsumowując, wykonujemy następujące kroki:
- Oblicz wektor, który wskazuje z obiektu na docelowe położenie (kursor)
- Znormalizuj ten wektor (zmniejszając jego długość do 1)
- Przeskaluj ten wektor do odpowiedniej wartości (mnożąc go przez pewną wartość)
- Przypisz ten wektor do przyspieszenia
Oto jak wygląda ten program ze wszystkimi, w pełni zaimplementowanymi krokami:
Być może zastanawiasz się, dlaczego koło nie zatrzymuje się, gdy dotrze do celu. Ważne jest, aby zauważyć, że poruszający się obiekt nie wie o tym, że ma zatrzymać się w punkcie docelowym; wie tylko gdzie jest cel i stara się dotrzeć tam tak szybko jak to możliwe. Poruszanie się tak szybko jak to możliwe oznacza, że niechybnie minie punkt docelowy i musi zawrócić, znowu przemieszczając się tak szybko jak to możliwe w kierunku celu, przekraczając go ponownie, i tak dalej. Zostań z nami; w kolejnych rozdziałach nauczymy się jak zaprogramować obiekt, aby osiągał dane położenie (zwalniał w miarę zbliżania się).
Ten przykład jest niezwykle bliski pojęciu przyciągania grawitacyjnego (gdy obiekt przyciągany jest do położenia kursora). Przyciąganie grawitacyjne będzie opisane bardziej szczegółowo w następnym rozdziale. Jednakże, brakuje tu jednej rzeczy: siła grawitacji (moduł przyspieszenia) jest odwrotnie proporcjonalna do odległości. To oznacza, że im bliżej kursora jest obiekt, tym bardziej przyspiesza.
Zobaczmy jak ten przykład będzie wyglądać z tablicą moverów (więcej niż jednym).
Ten kurs "Symulacje Natury" jest pochodną z "Natury Kodu " stworzonej przez Daniela Shiffmana, użytej pod licencją Creative Commons Attribution-NonCommercial 3.0 Unported License.
Chcesz dołączyć do dyskusji?
Na razie brak głosów w dyskusji