Pages: [1]   Go Down
Author Topic: invertire l'angolo [matematica]  (Read 1042 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

in matematica sono negato e sto cercando di ricavarmi una formula.
ho creato una variabile direzione che è compresa tra 0 e 360, che io uso per ricordarmi la direzione dell'oggetto in gradi.
quando si verifica una collisione l'angolo viene invertito.
per esempio:
direzione 30° l'angolo viene girato a 150°
direzione 150° l'angolo viene girato a 30°
direzione 210° l'angolo viene girato a 330°
direzione 330° l'angolo viene girato a 210°
.....
viene tutto specchiato da destra a sinistra

io ho pensato a 180-direzione ma funziona solo per angoli minori di 180
riuscite ad aiutarmi a fare questa formula matematica?
Logged

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa ma non mi sembra molto chiaro quello che chiedi, che vuol dire 'angolo invertito' ?
rispetto a cosa?
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

Torino
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Se ho capito quello che ti serve, potresti tenere la tua formula (180-direzione) è aggiungere un if tipo:
Code:
x=180-direzione;
if (x<0) x=360-x;

Però, anche se non ho idea di quanto dovresti cambiare il resto del codice, credo ti sarebbe infinitamente più comodo cosiderare come "diritto" l'angolo 0° e avere a destra da -1° a -180° e a sinistra da +1° a +180°..


EDIT:
oppure te la cavi con x=(540-direzione)%360, credo..
« Last Edit: April 16, 2013, 09:58:36 am by VanDerTull » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quando giocavo col Commodore Basic prima e col Gw-Basic dopo mi divertivo a fare dei giochini in cui degli oggetti rimbalzavano sui bordi dello schermo.  smiley-yell

Comunque nel tuo caso, controlla se l'angolo è maggiore di 180, nel caso toglilo da 360 invece che da 180.
210-180=-30
180-30 = 150
360-210=150
Logged


Offline Offline
Sr. Member
****
Karma: 4
Posts: 408
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora i miei esempi: in viola l'angolo che conosco in verde il risultato


@VanDerTull credo che il codice funzioni ma con 360 +x,  ora provo
Code:
x=180-direzione;
if(x<0) x=360+x;
Logged

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 271
Posts: 21872
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Praticamente 0 gradi é l'orizontale destra e vuoi specchiare gli angoli sulla verticale?

Non puoi definire la verticale in su come riferimento di zwero gradi?

Ciao Uwe
Logged

MC
Offline Offline
God Member
*****
Karma: 14
Posts: 917
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quando giocavo col Commodore Basic prima e col Gw-Basic dopo mi divertivo a fare dei giochini in cui degli oggetti rimbalzavano sui bordi dello schermo.  smiley-yell

Comunque nel tuo caso, controlla se l'angolo è maggiore di 180, nel caso toglilo da 360 invece che da 180.
210-180=-30
180-30 = 150
360-210=150

è ma non funziona!!!
non fare il furbo, rileggi il primo post!!
 smiley-lol
Logged

Vi è una spiegazione scientifica a tutto.
La fede è solo quell'anello che si porta al dito dopo il matrimonio.

0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 477
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ci stavo provando anche io quando mi sono chiesto che succede quando l'angolo è 90°. Tu parli di direzione ma per rappresentarla non ti basta il solo angolo direzione, ci vuole anche il verso perché è un vettore. Il caso dei 90° è proprio quello che con la formula 180-x non risolvi visto che ti da daccapo 90 mentre tu devi tornare indietro, cioè cambiare verso.
Se vuoi rappresentare con un solo numero allora il centro deve stare nell'oggetto che si muove, quindi nel caso del primo disegno, se l'oggetto va da sinistra verso destra l'angolo è prima 330 e dopo il rimbalzo 30. Il caso dei 90° il rimbalzo lo fa diventare 270°. 180° e zero rimangono gli stessi.

Ma cos'è esattamente che vuoi fare? Cioè per cosa ti serve questo calcolo?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

@nik77:
è vero, perché lui usa una riflessione su un solo asse, non un "rimbalzo" sulle 4 direzioni.

Code:
if (x < 180) {
  x = abs(180-x);
} else {
  x = 360-(x-180);
}

Così funziona
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 137
Posts: 9724
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

io ho pensato a 180-direzione ma funziona solo per angoli minori di 180
 riuscite ad aiutarmi a fare questa formula matematica?

Il tuo ragionamento è sbagliato addirittura nei valori che hai calcolato, per invertire la direzione aggiungi o sottrai 180°, quindi se parti da 30° devi andare per 210° o per -150°, dipende dal riferimento.
Il modo più semplice per risolvere, mantenendo la tua scala di misura 0-360° con valori solo positivi, è sommare 180° alla direzione attuale e verificare se il valore calcolato supera 360°, in questo caso sottrai 360° dal valore ottenuto, oppure verifichi prima se il valore è >= 180° e invece di sommare 180 lo sottrai
Esempio con i tuoi valori:

direzione 30°  +180° = 210°
direzione 150° +180° = 330°
direzione 210° +180°=  390°, eccede 360° pertanto 390-360 = 30°
direzione 330° +180° =  510°, eccede 360° pertanto 510-360 = 150°
Logged

0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 477
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Leo, la tua formula non si può semplificare così?

Code:
if (x < 180) {
  x = abs(180-x);
} else {
  x = 540-x;
}


Però con 90° restituisce daccapo 90°, così come con 270°, credo che il problema del verso rimanga.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Leo, la tua formula non si può semplificare così?

Code:
if (x < 180) {
  x = abs(180-x);
} else {
  x = 540-x;
}
Sì, te l'avevo scritta per esteso per far vedere com'ero arrivato al risultato.

Quote

Però con 90° restituisce daccapo 90°, così come con 270°, credo che il problema del verso rimanga.
Con 90 restituisce 90 perché così mi pare sia la tua logica.
Vedendo i tuoi disegni, tutto quello che colpisce dall'alto, rimbalza verso l'alto di un angolo complementare. Così se impatta a 90° torna a 90°.
Tu mi sa che fai confusione fra la direzione ed il verso  smiley-wink
L'angolo a 150° non mi dice in che verso sto andando perché potrei stare arrivando verso la superficie a 150° così come essere rimbalzato mentre stavo provenendo da 30°.
Logged


0
Offline Offline
Sr. Member
****
Karma: 4
Posts: 477
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mi autoquoto.

Ci stavo provando anche io quando mi sono chiesto che succede quando l'angolo è 90°. Tu parli di direzione ma per rappresentarla non ti basta il solo angolo direzione, ci vuole anche il verso perché è un vettore. Il caso dei 90° è proprio quello che con la formula 180-x non risolvi visto che ti da daccapo 90 mentre tu devi tornare indietro, cioè cambiare verso.
Se vuoi rappresentare con un solo numero allora il centro deve stare nell'oggetto che si muove, quindi nel caso del primo disegno, se l'oggetto va da sinistra verso destra l'angolo è prima 330 e dopo il rimbalzo 30. Il caso dei 90° il rimbalzo lo fa diventare 270°. 180° e zero rimangono gli stessi.

Ma cos'è esattamente che vuoi fare? Cioè per cosa ti serve questo calcolo?

Le domande le faccio a ilmandorlone e i disegni sono i suoi, anche io sospetto una confusione tra direzione e verso. La mia proposta era di mettere l'origine sull'oggetto che si muove per cui se va verso il basso sono 270°, verso l'alto 90° a destra 0° e sinistra 180° (si può anche ruotare di 90° a sinistra se l'angolo viene da una bussola). In questo caso la direzione ha anche il verso perché l'origine è sull'oggetto che si muove. Se invece l'origine è nel punto di impatto allora non c'è.... verso, ci vuole direzione e... verso!
Ma se non sappiamo qual'è il problema in origine non ne veniamo fuori. Da cui le domande sul motivo di questo calcolo.
Logged

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 137
Posts: 9724
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

  Da cui le domande sul motivo di questo calcolo.

Ma cosa ve ne frega di sapere per cosa deve fare questo calcolo ?
La domanda è chiara e la soluzione l'ho già fornita io, non capisco che problemi vi state ponendo.

Code:
if (angolo >= 180) nuovoangolo = angolo - 180;
 else nuovoangolo = angolo +180

Logged

Pages: [1]   Go Up
Jump to: