Di recente ho imparato che usiamo molto il teorema di Pitagora nei nostri calcoli di fisica e temo di non capire davvero il punto.
Ecco un esempio di un libro per assicurarsi che un oggetto non viaggi più velocemente di una MAXIMUM_VELOCITY
costante sul piano orizzontale:
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;
}
}
Proviamo questo con alcuni numeri:
Un oggetto sta tentando di spostare 5 unità in xe 5 unità in z. Dovrebbe essere in grado di muovere solo 5 unità in orizzontale in totale!
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
}
}
Ora funziona bene, ma possiamo fare la stessa cosa senza Pitagora:
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
}
}
Vantaggi del farlo senza Pitagora:
- Meno righe
- All'interno di queste righe, è più facile leggere cosa sta succedendo
- ... e richiede meno tempo per il calcolo, poiché ci sono meno moltiplicazioni
Mi sembra che i computer e gli umani ottengano un affare migliore senza il teorema di Pitagora! Tuttavia, sono sicuro di sbagliarmi poiché ho visto il teorema di Pitagora in un certo numero di luoghi affidabili, quindi vorrei che qualcuno mi spiegasse il vantaggio di usare il teorema di Pitagora per un neofita della matematica .
Questo ha qualcosa a che fare con i vettori di unità? Per me un vettore unitario è quando normalizziamo un vettore e lo trasformiamo in una frazione. Lo facciamo dividendo il vettore per una costante più grande. Non sono sicuro di cosa sia costante. La dimensione totale del grafico? Comunque, poiché è una frazione, lo prendo, un vettore di unità è fondamentalmente un grafico che può adattarsi all'interno di una griglia 3D con l'asse x che va da -1 a 1, l'asse z che corre da -1 a 1 e y -asse che va da -1 a 1. Questo è letteralmente tutto ciò che so sui vettori di unità ... non molto: P E non riesco a vedere la loro utilità.
Inoltre, non stiamo davvero creando un vettore unitario negli esempi precedenti. Dovrei determinare lo scalare in questo modo:
// 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
Ancora una volta, non riesco a capire perché sia meglio, ma è più "unit-vector-y" perché multiplicative_scalar è un unit_vector? Come puoi vedere, uso parole come "unit-vector-y", quindi non sono un mago della matematica! Consapevole anche che i vettori di unità potrebbero non avere nulla a che fare con il teorema di Pitagora, quindi ignora tutto questo se sto abbaiando sull'albero sbagliato.
Sono una persona molto visiva (modellista 3D e concept artist di mestiere!) E trovo diagrammi e grafici davvero, davvero utili, per quanto più umanamente possibile, per favore!
sqrt(2.5*2.5 + 2.5*2.5)
(2.5, 2.5)
ha una magnitudine di circa 3,54, non di 5.