| 
 | |||||||
| 
 | 
|  | 
|  | 
|  | Strumenti | 
|  04-06-2004, 18:37 | #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 | 
|   |   | 
|  04-06-2004, 19:50 | #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 ?
		 | 
|   |   | 
|  04-06-2004, 20:18 | #3 | 
| Senior Member Iscritto dal: Feb 2002 
					Messaggi: 906
				 | 
		si...............
		 | 
|   |   | 
|  04-06-2004, 20:29 | #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... | 
|   |   | 
|  04-06-2004, 20:42 | #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
} | 
|   |   | 
|  04-06-2004, 22:30 | #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????????? | 
|   |   | 
|  05-06-2004, 01:26 | #7 | 
| Senior Member Iscritto dal: Feb 2002 
					Messaggi: 906
				 | 
		okay................... grazie cionci risolto!!!!!!!!!!!! | 
|   |   | 
|   | 
| Strumenti | |
| 
 | 
 | 
Tutti gli orari sono GMT +1. Ora sono le: 01:56.









 
		 
		 
		 
		






 
  
 



 
                        
                        










