Niedawno dowiedziałem się, że często używamy twierdzenia Pitagorasa w naszych obliczeniach fizycznych i obawiam się, że tak naprawdę nie rozumiem.
Oto przykład z książki, aby upewnić się, że obiekt nie porusza się szybciej niż MAXIMUM_VELOCITY
stała w płaszczyźnie poziomej:
MAXIMUM_VELOCITY = <any number>;
SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY;
function animate(){
var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
x_velocity = x_velocity / scalar;
z_velocity = x_velocity / scalar;
}
}
Spróbujmy tego z kilkoma liczbami:
Obiekt próbuje przesunąć 5 jednostek w x i 5 jednostek w z. Łącznie powinno być w stanie przesunąć tylko 5 jednostek w poziomie!
MAXIMUM_VELOCITY = 5;
SQUARED_MAXIMUM_VELOCITY = 5 * 5;
SQUARED_MAXIMUM_VELOCITY = 25;
function animate(){
var x_velocity = 5;
var z_velocity = 5;
var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
var squared_horizontal_velocity = 5 * 5 + 5 * 5;
var squared_horizontal_velocity = 25 + 25;
var squared_horizontal_velocity = 50;
// if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
if( 50 <= 25 ){
scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
scalar = 50 / 25;
scalar = 2.0;
x_velocity = x_velocity / scalar;
x_velocity = 5 / 2.0;
x_velocity = 2.5;
z_velocity = z_velocity / scalar;
z_velocity = 5 / 2.0;
z_velocity = 2.5;
// new_horizontal_velocity = x_velocity + z_velocity
// new_horizontal_velocity = 2.5 + 2.5
// new_horizontal_velocity = 5
}
}
Teraz działa to dobrze, ale możemy zrobić to samo bez Pitagorasa:
MAXIMUM_VELOCITY = 5;
function animate(){
var x_velocity = 5;
var z_velocity = 5;
var horizontal_velocity = x_velocity + z_velocity;
var horizontal_velocity = 5 + 5;
var horizontal_velocity = 10;
// if( horizontal_velocity >= MAXIMUM_VELOCITY ){
if( 10 >= 5 ){
scalar = horizontal_velocity / MAXIMUM_VELOCITY;
scalar = 10 / 5;
scalar = 2.0;
x_velocity = x_velocity / scalar;
x_velocity = 5 / 2.0;
x_velocity = 2.5;
z_velocity = z_velocity / scalar;
z_velocity = 5 / 2.0;
z_velocity = 2.5;
// new_horizontal_velocity = x_velocity + z_velocity
// new_horizontal_velocity = 2.5 + 2.5
// new_horizontal_velocity = 5
}
}
Korzyści z robienia tego bez Pitagorasa:
- Mniej linii
- W tych liniach łatwiej jest przeczytać, co się dzieje
- ... a obliczenie zajmuje mniej czasu, ponieważ jest mniej mnożników
Wydaje mi się, że komputery i ludzie mają lepszą ofertę bez twierdzenia Pitagorasa! Jestem jednak pewien, że się mylę, ponieważ widziałem twierdzenie Pitagorasa w wielu renomowanych miejscach, dlatego chciałbym, aby ktoś wyjaśnił mi korzyści płynące z zastosowania twierdzenia Pitagorasa nowicjuszowi z matematyki .
Czy to ma coś wspólnego z wektorami jednostkowymi? Dla mnie wektorem jednostkowym jest normalizacja wektora i przekształcenie go w ułamek. Robimy to, dzieląc wektor przez większą stałą. Nie jestem pewien, jaka to stała. Całkowity rozmiar wykresu? W każdym razie, ponieważ jest to ułamek, rozumiem, wektor jednostkowy jest w zasadzie wykresem, który może zmieścić się w siatce 3D z osią x od -1 do 1, osią z od -1 do 1, a y - oś biegnie od -1 do 1. To dosłownie wszystko, co wiem o wektorach jednostkowych ... niewiele: P I nie widzę ich przydatności.
Ponadto tak naprawdę nie tworzymy wektora jednostkowego w powyższych przykładach. Czy powinienem określać skalar w ten sposób:
// a mathematical work-around of my own invention. There may be a cleverer way to do this! I've also made up my own terms such as 'divisive_scalar' so don't bother googling
var divisive_scalar = (squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY);
var divisive_scalar = ( 50 / 25 );
var divisive_scalar = 2;
var multiplicative_scalar = (divisive_scalar / (2*divisive_scalar));
var multiplicative_scalar = (2 / (2*2));
var multiplicative_scalar = (2 / 4);
var multiplicative_scalar = 0.5;
x_velocity = x_velocity * multiplicative_scalar
x_velocity = 5 * 0.5
x_velocity = 2.5
Ponownie nie rozumiem, dlaczego jest to lepsze, ale jest to bardziej „wektor-jednostka-y”, ponieważ multiplikatywny_skalar to wektor_jednostkowy? Jak widać, używam słów takich jak „jednostka-wektor-y”, więc tak naprawdę nie jestem matematyką! Wiedz też, że wektory jednostkowe mogą nie mieć nic wspólnego z twierdzeniem Pitagorasa, więc zignoruj to wszystko, jeśli szczekam na niewłaściwym drzewie.
Jestem osobą bardzo wizualną (modelarz 3D i artysta koncepcyjny z zawodu!) I uważam, że diagramy i wykresy są naprawdę, bardzo pomocne, więc jak najwięcej ludzi proszę!
sqrt(2.5*2.5 + 2.5*2.5)
(2.5, 2.5)
ma wielkość około 3,54, a nie 5