Mnożenie i dzielenie to sposoby na zmianę długości wektora bez zmiany kierunku, co mieliśmy okazję przed chwilą zaobserwować. Może zastanawiacie się “Ok, to w takim razie skąd wiem jak długi jest wektor? Znam współrzędne (x i y), ale jak długa (w pikselach) jest sama strzałka?” Zrozumienie sposobu na obliczanie długości(nazywanej też wartością) wektora jest bardzo przydatne i ważne.
Zauważcie to, że na powyższym wykresie mamy trójkąt prostokątny utworzony z wektora, narysowanego jako strzałki i dwóch współrzędnych (x i y). Boki są współrzędnymi a przeciwprostokątna to strzałka. Całe szczęście, że jest to trójkąt prostokątny, ponieważ dawno temu pewien grecki matematyk Pitagoras opracował wspaniały wzór opisujący zależność pomiędzy bokami a przeciwprostokątną trójkąta prostokątnego.
Twierdzenie Pitagorasa mówi, że wartość boku a a podniesiona do kwadratu i wartość boku b b podniesiona do kwadratu równa jest wartości c c podniesionej do kwadratu.
Za pomocą tego wzoru możemy obliczyć wartość v \vec{v} w następujący sposób:
v=vxvx+vyvy ||\vec{v}|| = \sqrt{v_x * v_x + v_y * v_y}
Kod pozwalający na implementację tego w obiekcie PVector wygląda tak:
PVector.prototype.mag = function() {
  return sqrt(this.x*this.x + this.y*this.y);
};
Poniższy przykład ukazuje wartość wektora z paskiem na górze:
Obliczanie wartości wektora to dopiero początek. Funkcja obliczająca wartość daje nam dostęp do wielu możliwości. W pierwszej kolejności omówimy normalizację. Normalizacja to proces przerabiania czegoś do postaci “standardowej” albo po prostu “normalnej.” W przypadku wektorów załóżmy, że standardowy wektor ma długość równą 1. Normalizacja wektora polega na wzięciu wektora o dowolnej długości, zachować kierunek w który jest zwrócony i zmienić jego długość na 1, zamieniając go w tak zwany wektor jednostkowy.
Skoro opisuje on kierunek wektora niezależnie od jego długości, warto, aby wektory jednostkowe były łatwo dostępne. Okaże się to bardzo przydatne gdy zaczniemy pracować z siłami w następnym rozdziale.
Dla dowolnego wektora u \vec{u} , jego wektor jednostkowy (zapisywany jako u^ \hat{u} ) jest obliczany w sposób następujący:
u^=uu \hat{u} = \dfrac{\vec{u}}{||\vec{u}||}
Innymi słowy normalizacja wektora polega po prostu na podzieleniu współrzędnych przez wartość. To całkiem intuicyjne. Powiedzmy, że wektor ma długość 5. Cóż, 5 podzielone przez 5 daje 1. Tak więc patrząc na nasz trójkąt prostokątny, musimy zredukować przeciwprostokątną dzieląc przez 5. W trakcie tej operacji boki również się zmniejszą, bo także zostaną podzielone przez 5.
W naszym obiekcie PVector umieścimy więc następującą funkcję normalizującą:
PVector.prototype.normalize = function() {
  var m = this.mag();
  this.div(m);
};
Oczywiście istnieje pewien drobny problem. Co się stanie, jeżeli wielkość wektora wynosi 0? Nie możemy dzielić przez 0! Szybkie sprawdzanie błędu powinno to naprawić:
PVector.prototype.normalize = function() {
  var m = this.mag();
  if (m > 0) {
    this.div(m);
  }
};
Oto program który zawsze znormalizuje wektor który przedstawia pozycję myszki od środka (po czym pomnoży ją, abyśmy mogli ją zobaczyć - w końcu 1 piksel nie jest wcale duży!):

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.
Ładowanie