PDA

View Full Version : [C# & DirectX]Problema con campo di esistenza nel rappresentare funzioni 2 variabili


Radeon89
28-05-2008, 21:19
Ciao a tutti!
Ho scritto pochi giorni fa per un problema (http://www.hwupgrade.it/forum/showthread.php?t=1748584)...
Ho risolto, solo che ora ne ho un altro, cerco la soluzione migliore per risolverlo.

La funzione in esame è questa: Z=y*(log(x)), nell'intervallo che va da -32 a 32, sia per x che per y. Immaginate quindi, per quanto riguarda la rappresentazione di questa funzione, inizialmente un piano fatto di 64*64 vertici, a cui poi assegnerò l'altezza e il colore e, se non farà parte del campo di esistenza, il valore alpha a 0 per avere la trasparenza.

Però non capisco questo comportamento...

Il campo di esistenza di questa funzione è per x>0, quindi di vertici nella metà di sinistra non dovrei avere nulla. Eppure sembra proprio che comunque un vertice venga tracciato (coordinate: 0,64,0 pare). Dopodiché viene collegato agli altri vertici... Creando un brutto effetto...

http://img232.imageshack.us/img232/2161/vistadallaltokt3.jpg (http://imageshack.us)
Questa è la vista dall'alto, la parte piana di sinistra non dovrebbe esserci

http://img134.imageshack.us/img134/7802/profiloci4.jpg (http://imageshack.us)
Questa è la vista di profilo, il triangolone a sinistra non dovrebbe esserci, che poi sarebbe la parte piana che c'è sopra...

Ho pensato, dato che non capisco come mai quel vertice venga tracciato, che potrei rendere trasparenti anche quei vertici "di confine" a x=1, solo che dovrei farlo con una funzione che controlli per ogni vertice se almeno uno di quelli di fianco non appartiene al campo di esistenza e quindi renderlo trasparente, e credo che sarebbe una cosa molto laboriosa in quanto a tempo di elaborazione...

Non esiste un modo per non far tracciare quel vertice?? Suppongo che venga tracciato perché è il limite del mio piano iniziale di vertici... O per lo meno credo... Però devo fare in modo di sistemare questo problema:help:

71104
28-05-2008, 22:11
facevi prima a fare una tesina sulla seconda guerra mondiale :asd:

Radeon89
28-05-2008, 22:18
facevi prima a fare una tesina sulla seconda guerra mondiale :asd:

Ci penserò per la tesi di laurea in ingegneria informatica :D :D

:Prrr:

Tommo
28-05-2008, 22:27
Comprendo la tua situazione... :stordita:
Io pure avevo iniziato a fare una tesina mirabolante con una rete neurale a modello evolutivo collegata ad una ragdoll per fungere da muscoli...

ma invece ora la faccio sul progresso, senza manco powerpoint :D

E' che con queste cose è impossibile rispettare una data "di rilascio"... e si rischia il buggone del giorno prima ;)

Cmq vedi se non salti il primi index dei buffers, lasciando quindi i valori default...

Radeon89
29-05-2008, 22:32
Boh, io non capisco, ora vi posto il ciclo...


Color clInvalid = new Color();
clInvalid = Color.FromArgb(0, Color.Black); //colore trasparente
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
switch (validazioneVertici[x,y])
{
case 0://se non sono validi assegno il colore bianco e la componente alpha a 0 (trasparenza assoluta)
vertici[x + y * width].Color = clInvalid.ToArgb();
vertici[x + y * width].Z = 100;
break;
case 1://se sono validi gli assegno un colore e l'altezza
vertici[x + y * width].Color = cl.ToArgb();
vertici[x + y * width].Position = new Vector3(x, y, (float)functionHeightData[x, y]);
break;
case 2:
vertici[x + y * width].Color = clInvalid.ToArgb();
vertici[x + y * width].Position = new Vector3(x, y, (float)functionHeightData[x, y]);
break;
case 3:
vertici[x + y * width].Color = clInvalid.ToArgb();
vertici[x + y * width].Position = new Vector3(x, y, (float)functionHeightData[x, y]);
break;
}
if (avanzaCalcolo != null)
avanzaCalcolo(this);
}


Questo è il ciclo che passa tutti i vertici per assegnarli l'altezza e il colore, a seconda che siano validi o meno... Con l'istruzione che ho aggiunto nel case 0 ( vertici[x + y * width].Z = 100; ) i vertici non validi vengono, oltre che cambiati di colore e resi trasparenti, alzati all'altezza 100. Ora, provando il programma in questo modo noto che il vertice che non dovrebbe vedersi si alza come previsto, quindi il ciclo non salta il vertice, ed entra anche nel case, ma quindi cosa succede, l'istruzione prima non viene eseguita!!??!?!?!?!? :help:

Radeon89
30-05-2008, 18:11
Nessuno?

Radeon89
30-05-2008, 22:23
:help: :help: :help: Ho creato anche la funzione che rende trasparenti i pixel al confine del campo di esistenza ma NULLA!!!! come diavolo è possibile?? :help: :help: :help:

Radeon89
31-05-2008, 14:50
Ragazzi, ho sistemato tutto finalmente!! :D

Sbagliavo alcune cose, ad esempio non definivo nemmeno una posizione per i vertici trasparenti, e poi ho implementato quella funzione di cui parlavo qualche post fa, cioè quella di rendere invalidi (cioè trasparenti) anche i vertici al confine con i vertici veramente invalidi (che non appartengono al campo di esistenza)