Repérer des valeurs dans une matrice

badboy38 Messages postés 95 Date d'inscription vendredi 14 janvier 2005 Statut Membre Dernière intervention 4 mars 2013 - 22 mars 2006 à 10:59
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 22 mars 2006 à 23:04
Bonjour,



Avant de vous exposer mon problème, je tiens à préciser que je ne
demande pas de code, mais juste des pistes à suivre pour résoudre mon
problème (en gros je ne demande pas qu'on me fasse le boulot, juste
qu'on me dise comment je peux faire...)



Je dois retrouver dans la matrice float T[100][100] qui contient
la température des points d'une plaque les valeurs identiques pour
ensuite tracer les isothermes. J'ai beau me casser le cerveau, j'ai
aucune idée de la façon de faire ça... si quelqu'un a une idée...



Merci!




P.S. je code en C sous linux...
BadBoy38


<hr size="2" width="100%">--==OPEN.SOURCES.FREE.FR==--

2 réponses

Tekila48 Messages postés 15 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 26 mars 2006
22 mars 2006 à 11:41
Je peux te proposer une solution, mais à ce genre de problème il y autant de solutions que de personnes qui cherchent.



Déjà, déterminer ce qu'on cherche : une isotherme, c'est une ligne,
donc un tableau de coordonnées. Si tu en as plusieurs, c'est un tableau
à deux dimensions de coordonnées :



struct SPOINT {float x, float short y} Isothermes[10][10000]; //pour 10 isothermes de 10000 points (10000 = 100*100)



Une isotherme est définie par une valeur, donc on aura aussi un tableau
de températures : float IsoTemp[10]; //A remplir avec
les valeurs d'isothermes recherchées



ensuite, il faut balayer le tableau et pour chaque point, déterminer si
une des isothermes passe entre ce point et un de ses voisins



Par exemple, pour le points (X,Y)=383K, (X,Y+1) = 421K et IsoTemp[0] =
400K : if(Val[X][Y] < IsoTemp[0] && Val[X][Y+1] >
IsoTemp[0])



Alors dans ce cas il faut enregistrer le point (2,2.5) dans Isotherme[0][i] : Isotherme[0][i].x = X; Isotherme[0][i].y = Y+0.5



J'ai mis 2.5 car l'isotherme passe entre le point 2,2 et 2,3. Il y a
extremement peu de chances que l'isotherme tombe sur un point mesuré.

Ca tombe bien, x et y sont des float, il n'y a donc pas de problème pour enregistrer 2,2.5



Ensuite, faire de même avec les points X-1,Y; X+1,Y; X,Y+1; X,Y-1.



Voilà, j'espère avoir pû t'aider.

Tekila48
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
22 mars 2006 à 23:04
Bon je propose autre chose.

Avec ma soluce, tu devrais pouvoir obtenir des résultats propres, mais
pas exactement exact :) mais je pense pas qu'à vue d'oeil, on puisse
voir la différence.



Donc ce que je ferais:

- utiliser des bspline pour interpoler tous tes points de température
par une surface définie mathématiquement. C'est la qu'on fait une
approximation en disant que la surface C2 (deux fois dérivable) obtenue
par les bsplines reflètent bien l'évolution de température entre les
points discrets. C'est l'interet des bsplines. Des lors en fait, la
température se voit mieux comme une altitude :) mais ca, ca change rien.

Tu pourras donc aussi avoir la dérivée première et seconde en tout point par une relation mathématique.



Apres il faut trouver une méthode de résolution qui te donne les points de meme altitude.

Tu pourrais calculer le gradient en tout point, ce qui te donnera la
ligne de plus grande pente. En fait le gradient est ici orthogonale au
isotherme (il me semble). En faisant le produit vectoriel entre le
gradient avec le vecteur normal à la courbe (obtenu facilement avec les
dérivées), tu auras un espèce de champ de vecteur, où en fait, la
direction de chaque vecteur correspondera a la tangeante à l'isotherme
en ce point. C'est pas les isothermes, mais presque :) en tout cas, ca
donne une bonne idée de leur forme.

Sinon dans l'immédiat je vois pas comment avoir exactement les isothermes.

Ya surement des trucs à tester, comme:

- tu pars d'une altitude quelconque, tu avances selon le vecteur
orthogonale au gradient mais dans le plan tangeant a la surface, ca te
donne un point a tout petit peu plus loin (très peu, plus la distance
est faible, meilleur sera le résultat), puis tu regardes la valeur de
la température en ce point. Si c'est inférieur, tu montes selon le
gradient, et inversement. Et tu procèdes ensuite par une espèce de
dicotomie en essayant de te rapprocher de la température voulue. Puis
apres tu recommences avec ce nouveau point. etc ....



Bon voila ce qui me vient en tete pour le moment.
0
Rejoignez-nous