invertire l'angolo [matematica]

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?

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

Se ho capito quello che ti serve, potresti tenere la tua formula (180-direzione) è aggiungere un if tipo:

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

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. :stuck_out_tongue_closed_eyes:

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

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

x=180-direzione;
if(x<0) x=360+x;

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

leo72:
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. :stuck_out_tongue_closed_eyes:

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!!
XD

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?

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

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

Così funziona

ilmandorlone:
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°

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

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.

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

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.

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 :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°.

Mi autoquoto.

zoomx:
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.

zoomx:
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.

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