If you're seeing this message, it means we're having trouble loading external resources on our website.

Jeżeli jesteś za filtrem sieci web, prosimy, upewnij się, że domeny *.kastatic.org i *.kasandbox.org są odblokowane.

Główna zawartość

Długość i normalizacja wektora

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.
Rysunek 1.10: Długość lub „wartość” wektora v, with, vector, on top  jest często zapisywana jako: vertical bar, vertical bar, v, with, vector, on top, vertical bar, vertical bar
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 podniesiona do kwadratu i wartość boku b podniesiona do kwadratu równa jest wartości c podniesionej do kwadratu.
Za pomocą tego wzoru możemy obliczyć wartość v, with, vector, on top w następujący sposób:
vertical bar, vertical bar, v, with, vector, on top, vertical bar, vertical bar, equals, square root of, v, start subscript, x, end subscript, times, v, start subscript, x, end subscript, plus, v, start subscript, y, end subscript, times, v, start subscript, y, end subscript, end square root
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, with, vector, on top, jego wektor jednostkowy (zapisywany jako u, with, hat, on top) jest obliczany w sposób następujący:
u, with, hat, on top, equals, start fraction, u, with, vector, on top, divided by, vertical bar, vertical bar, u, with, vector, on top, vertical bar, vertical bar, end fraction
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.