|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
x cionci [vc6] Direct3d
ciao amico mio................. sto lavorando in direct3d e directx:
La domanda principale è: Nella mappa che ho fatto devo valutare, dalle coordinate di dove mi trovo x e z se il punto, appunto x e z, si trova sul primo triangolo o il secondo..................... mi spiego meglio: Innanzitutto ogni quadrato della mappa è formato da 2 triangoli esempio: 0.....5 per la x ------/5 t1/t2| /-----|0 per la y coordinate in pixel anche se il disegno è in pò primordiale, si capisce che t1 è il primo triangolo e t2 è il secondo........ ora avendo le coordinate x e z riesco a prendere gli indici, del Indexbuffer che sono così costituiti: 0 1 2 per il primo triangolo t1 e 3 4 5 per t2 il secondo triangolo: questa è la ma formula per estrarre gli indice dall'index buffer: s=cz+3; v1=pVertices[s].position; v2=pVertices[s+1].position; v3=pVertices[s+2].position; cz+3 è perche prendo sempre gli indici + grandi in questo caso 3 4 5......... ora facendo i dovuti calcoli riesco a camminare in quota sul mio terreno................................ okay spiegato questo, passo alla domanda del tread: se guardi il mio disegno e provi a verificare la coordinata x=2 e z=6 io mi trovo sul primo triangolo il problema è che estraggo gli indici del secondo triangolo quindi dovrei calcolare che le coordinate x=2 e z=6 fanno parte del primo triangolo ed estrarre gli indici 0 1 2 ovvero s=cz-3 e infatti camminerei in quota anche sul primo triangolo per far questo ho pensato di prendere in considerazione la coordinata x tracciare una linea(lato) che congiunga un vertice di t1 vertice x=0 e y=0 (del primo triangolo e calcolare l'angolo e se l'angolo è >45° allora lascio s=cz+3 se <45° faccio s=cz-3 ------------------------------ Allora cionci mi aiuti a sviluppare questo piccolo algoritmo, sono a digiuno di geometria di angoli ecc, ecc............... ------------------------------ questo è il mio algoritmo: s=cz+3; v1=pVertices[s].position; v2=pVertices[s+1].position; v3=pVertices[s+2].position; /* Nota: v1,v2,v3 sono vettori appartenenti alla struct quindi: ora ho le coordinate del triangolo xyz v1.x v1.y v1.z.........v2.x v2.y v3.z e v3.x v3.y v3.z.....chiaro? */ //Questa sotto per ricavare gli angolo ma tieni presente // quello detto sopra float theta, alfa, angle, xnew, ynew, pi=3.14f; angle = 0; for(int i=0; i<3;i++){ if(i==0){ theta = atan2(v1.x - x, v1.y - z); xnew = (v2.x - x) * cos(theta) + (v2.y - z) * sin(theta); ynew = (v3.y - z) * cos(theta) - (v3.x - x) * sin(theta); } if(i==1){ theta = atan2(v2.x - x, v2.y - z); xnew = (v1.x - x) * cos(theta) + (v1.y - z) * sin(theta); ynew = (v3.y - z) * cos(theta) - (v3.x - x) * sin(theta); } if(i==2){ theta = atan2(v3.x - x, v3.y - z); xnew = (v1.x - x) * cos(theta) + (v1.y - z) * sin(theta); ynew = (v2.y - z) * cos(theta) - (v2.x - x) * sin(theta); } alfa = atan2(ynew, xnew); angle = angle + alfa; } if(fabs(angle)>pi){ s=cz;//estraggo gli indici 0 1 2 v1=pVertices[s].position; v2=pVertices[s+1].position; v3=pVertices[s+2].position; } .................................... //NON SONO SICURO DI QUESTA ROUTINE SOTTO //PUOI CONTROLLARE................. gli if ed else if e naturalmente // i valor passti e ritornati...... float CGame::atan2(float Y, float X) { float valore; float pi,hpi; pi=3.14f; hpi=hpi/2; if(X==0){ if(Y>0) valore=hpi; else if (Y<0) valore=-hpi; else valore=0; } else if(Y==0){ if(X<0){ valore = pi; } else{ valore = 0; } //} }else{ if(X<0){ if(Y>0){ // atan2=atn(Y/X)+pi; valore=tan(Y/X)+pi; }else{ // atan2=atn(Y/X)-pi; valore=tan(Y/X)-pi; } // } }else{ // atan2 = Atn(Y / X); valore = tan(Y / X); } } //spero in tuo aiuto...................... ciao amico mio W asm |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Fammi capire....tu in pratica vuoi sapere se un dato punto si trova su un triangolo o sull'altro ?
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
si...............
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Allora è molto più facile...
Devi trovare se un segmento fra il vertice in alto a destra (seguendo l'esempio) ed il punto da verificare interseca i meno il segmento in comune dei due triangoli... |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Anzi se è un quadrato allora è molto più semplice (mi confermi che sia un quadrato ?)...
Codice:
//la funzione ritorna 0 per il tringolo 1 e 1 per il triangolo 2 inline int GetTringle(int x0, int y0) { //per evitare di assegnare tutti i pnti sulla diagonale ad un //solo tringolo faccio questa cosa if(x0 == y0) return x0%2; if(y0 > x0) return 0; //trinagolo 1 return 1; //altrimenti tringolo 2 } |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
si i due triangoli formano un quadrato...................
il proble è che che non capisco quali sono i vertici da passare ............ in effetti non sto a 2 dimensioni ma 3 dimensioni.............. guarda di nuovo il mio primo post devo passare i vertici e per ogni triangolo sono 3 vertici costituiti dai punti: v1.x v1.y v1.z v2.x v2.y v2.z v3.x v3.y v3.z quali devo passare????????? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Feb 2002
Messaggi: 906
|
okay...................
grazie cionci risolto!!!!!!!!!!!! |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:17.