|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
ho 3 vettori e devo ricavare un angolo
ESEMPIO 1
Ho 3 vettori che sono in pratica un triangolo che io ricavo vDietro3 = pAI->Pos - pNodePath2[pAI->WayPos+1].Pos; vDietro2 = pNodePath2[pAI->WayPos].Pos - pNodePath2[pAI >WayPos+1].Pos; vDietro1 = pAI->Pos - pNodePath2[pAI->WayPos].Pos; con le funzioni di trigonometria vorrei ricavare almeno un angolo tra 2 vettori So solo che ottenendo l'angolo in gradi posso fare sin(angolo) e allora posso ricavare l'altezza del primo vettore oppure cos(angolo) e ricavare l'altezza del secondo vettore. non sò come procedere ESEMPIO 2 Un'altro modo che conosco è usare il dot di directx che è così: vDietro3 = pAI->Pos - pNodePath2[pAI->WayPos+1].Pos; vDietro2 = pNodePath2[pAI->WayPos].Pos - pNodePath2[pAI >WayPos+1].Pos; vDietro1 = pAI->Pos - pNodePath2[pAI->WayPos].Pos; vDietro4 = vDietro2; D3DXVec3Normalize( &vDietro2, &vDietro3 ); angolo = dot( vDietro2, vDietro3 ); calcol=D3DXVec3Length(&vDietro4); Altezza=sin(angolo)*calcol; ............ invece quì angolo è un numero che varia in continuazione e poi non capisco se è in gradi o radianti e quindi non riesci a capire se l'altezza trovata è giusta ???? |
![]() |
![]() |
![]() |
#2 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Il prodotto scalare di due vettori è pari al prodotto delle loro norme e del coseno dell'angolo formato.
Ossia: dati due vettori u e v che formano un angolo theta, vale sempre: "u scalar v" = ||u|| ||v|| cos theta Quindi, se hai u e v e vuoi ottenere theta, basta che fai: theta = arc cos ("u scalar v" / (||u|| ||v||) )
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
theta = arc cos ("u scalar v" / (||u|| ||v||) ) significa: theta = sin(u)/cos(v); //per caso?? se è così u e v come li ottieni oppure sono per caso le lunghezze dei miei 2 vettori ?? Ultima modifica di okay : 05-10-2005 alle 16:31. |
|
![]() |
![]() |
![]() |
#4 | |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
significa qualkosa del genere Codice:
inline float scalar(const Vector& a,const Vector& b){ return a.x*b.x+a.y*b.y+a.z*b.z; } Vector a,b; theta =acos(scalar(a,b)/sqrt(scalar(a,a))*sqrt(scalar(b,b)) ![]() ciauz Ultima modifica di The3DProgrammer : 05-10-2005 alle 16:41. |
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
ah,
ho riletto il tuo post,se a e b sono normalizzati ovviamente theta = acos(scalar(a,b)), in quanto il modulo delle normali è pari ad 1 ciauz |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
ma theta, come ultima info, mi ritorna l'angolo in radianti o gradi. Grazie |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
angolo = acos(scalar(vDietro2,vDietro1));
ma ho angolo che vale -1.#IND000 |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
così và bene:
angolo = cos(scalar(vDietro1, vDietro2)); ma questo valore è in gradi o radianti?? |
![]() |
![]() |
![]() |
#9 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Quote:
uhm... non va bene... scalar ritorna già cos(theta), ergo cos(scalar(....)) = cos(cos(theta)) per ricavare theta devi usare la funzione inversa del coseno, che è appunto l'arcoseno ( la funzione C è appunto acos()). ciauz |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
Aspettate un attimo.................. allora diciamola tutta (volevo verificare alcune certezze facendo alcuni calcoli) dunque: ho una spline.x formata da 466 vertici se navigo sulla spline sto a coordinate 0 se mi sposto dalla spline a destra o a sinistra ho un valora di scostamento che ho chiamato Dist quindi se Dist vale 0 io sto sulla spline.x. Questo calcolo lo faccio tramite: D3DXVec3Cross(&vRis1, &vBas, &vDir); ed è corretto per verificare che io lo possa fare in altri modi vi confermo questo: posso distanziarmi tramite: a=lenght(posizione attuale - vertice+1) b=lenght(vertice+1 - vertice) c=lenght(posizione attuale - vertice) ecco con anche in questo modo ottengo lo scostamento (l'ho verificato) tramite appunto il formarsi dal calcolo sopra di un triangolo, quindi applicando la regola per trovare l'altezza, ottengo che l'altezza di questo triangolo equivale allo scostamento dal Path b=lenght(vertice+1 - vertice) come il calcolo del D3DXVec3Cross. Stavo provando questo ed ultimo modo fatto con le leggi della trigonometria e cioè: In sintesi è così: ![]() Quindi h = sin(19.5°) × 3.7 km. sin(19.5°) = 0.3338, e quindi h = 0.3338 × 3.7 km = 1.24 km, arrotondando il risultato ragionevolmente. ECCO questo secondo me è l'altro modo per ricavare l'altezza/scostamento il mio codice per far questo ora è: vDietro1 = pAI->Pos - pNodePath2[pAI->WayPos+1].Pos; vDietro2 = pNodePath2[pAI->WayPos].Pos - pNodePath2[pAI->WayPos+1].Pos; vDietro3 = vDietro2; D3DXVec3Normalize( &vDietro1, &vDietro2 ); angolo = sin(scalar(vDietro1, vDietro2)); calcol=D3DXVec3Length(&vDietro3); Altezza=angolo*calcol;//Questo algoritmo (anche perchè l'angolo è già in radianti) è uguale alla figura ma con le verifiche che ho fatto non và bene potete verificare anche voi. |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
mi sembra corretto, con una eccezione:
angolo = acos(scalar(vDietro1, vDietro2)) poi puoi usare D3DXVec3Dot per il calcolo del prodotto scalare ciauz |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
per curiosità, che stai a fa?
![]() ciauz |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
con tutto sto code avevo questa svista: //Errore: normalizzavo vDietro1 su vDietro2 D3DXVec3Normalize( &vDietro1, &vDietro2 ); //Corrretto bisogna normalizzare i vettori D3DXVec3Normalize( &vDietro1, &vDietro1 ); D3DXVec3Normalize( &vDietro2, &vDietro2 ); angolo = acos(scalar(vDietro1, vDietro2)) acos e asin ora mi ritorna un numero corretto .... vado con le verifiche ciao Ultima modifica di okay : 06-10-2005 alle 03:49. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
No purtroppo i conti nin tornano:
vDietro1 = pAI->Pos - pNodePath2[pAI->WayPos+1].Pos; vDietro2 = pNodePath2[pAI->WayPos].Pos - pNodePath2[pAI->WayPos+1].Pos; vDietro3 = vDietro2;//mantengo la distanza originale di vDietro2 su vDietro3 D3DXVec3Normalize( &vDietro1, &vDietro1 ); D3DXVec3Normalize( &vDietro2, &vDietro2 ); angolo = asin(scalar(vDietro1, vDietro2));//oppure acos calcol=D3DXVec3Length(&vDietro3); Altezza=angolo*calcol; |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: May 2000
Messaggi: 1459
|
Ma certo!
![]() nn funzia xkè devi fare così angolo = acos(D3DXVec3Dot(vDietro1, vDietro2));//calcolo l'angolo - usa D3DXVec3Dot invece di scalar ![]() calcol=D3DXVec3Length(&vDietro3); Altezza=sin(angolo)*calcol; in quanto, come dicevi prima, cateto=sin(angoloOpposto)*ipotenusa. Acos ritorna l'angolo in radianti (se nn ricordo male) quindi devi fare calcol*sin(angolo) certe volte sono proprio un testicolo ![]() |
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
Quote:
no no non và altezza decresce fino ad arrivare a 0 e così via. Invece Altezza dovrebbe essere sempre 3.3465248 circa come nel calcolo giusto dell'altezza del triangolo. In questo caso con algoritmo trigonometrico sembra che calcoli il piano quindi da se provo con cos decresce con sin aumenta ho la vaga impressione che sbaglio il passaggio dei cateti/vettori a cammina----> >>>>>....a....>>>>>> .........../.|.\ ......../....|h....\ ...../.......|............\ n0-------------------n1 a cammina-----> >>>>>........a...>>>>>> .............../.|...\ ........../......|h....\ ...../...........|.........\ n0-------------------n1 vedi sopra: a cammina e altezza calcolata con sin deve essere sempre uguale il punto a è la posizione e và verso il nodo1 io devo conoscere h se guardi sopra il code è: a-n1 n0-n1//se n1-n0 è uguale ho numeri + senza forzare con un fabs quel decrescere o aumentare mi sembra come se devo cambiare cateto per il calcolo......... mi sto impippando il cervello! Ultima modifica di okay : 06-10-2005 alle 12:01. |
|
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
che coglione è naturale che l'angolo cambia, adesso che noto quelle specie di figure che ho fatto, l'angolo cambia ed è giusto. è l'altezza che calcolo male manca un solo passaggio o calcolo.
In definitiva l'angolo cambia sempre quello che varia è la lunghezza di a-n0 e a-n1 (i vettori) mentre n0-n1 è sempre uguale. ci devo ragionare un attimo sopra. (la figura bella sopra è di un tut per trigonometria (avessero sbagliato loro i calcoli!!)) se arrivate prima voi postate!! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:43.