Réaliser une surface suivant un nuage de points

Voir le sujet précédent Voir le sujet suivant Aller en bas

Réaliser une surface suivant un nuage de points

Message  iznogoud le Mer 19 Nov - 20:34

Bonjour à tous,

Voila mon problème, j'ai récupéré un fichier type CSV d'un logiciel de CAO 3D contenant les coordonnées (cartésienne : X;Y;Z) d'une série de points. Je souhaite donc "tendre" sur ce nuage de points une surface qui passent au mieux de tous les points.

Cela est-il réalisable ?

iznogoud

Nombre de messages : 6
Age : 35
Localisation : Strasbourg
Date d'inscription : 19/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Mer 19 Nov - 20:54

Bonsoir,

Il n'y a pas de fonctions prédéfinies pour faire directement ce genre de choses.

Est-ce que tu pourrais nous donner un exemple d'un tel nuage de points (il n' a pas besoin d'être très gros), que l'on voit ce que l'on peut faire.

Si par exemple les points forment un grille régulière en X et Y avec (X,Y) dans [a,b]x[c,d] et une valeur de Z en chaque "noeud" de la grille, ce ne devrait pas être difficile de faire une surface en facettes.

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  iznogoud le Mer 19 Nov - 21:04

Les résultats sortents sous la forme d'une série de (x,y,z) avec la logique suivante :
- on prend x et on le fait varier sur toute la plage (y reste fixe) et on calcul z
- lorsque le 1er cycle des x est fini, on fait varier y d'un incrémént, et on recommence en faisant varier x

On obtient donc un damier régulier en forme de rectangle.

J'ai également réaliser un classement avec excel pour former une matrice avec x et y en 1ère ligne et 1ère colonne, et chacuns des résultats sous forme de matrice

iznogoud

Nombre de messages : 6
Age : 35
Localisation : Strasbourg
Date d'inscription : 19/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Mer 19 Nov - 21:09

Bon à priori je pense qu'on peut faire quelque chose. Est-ce que tu peux mettre un fichier de données csv qu'on fasse un essai?

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  iznogoud le Mer 19 Nov - 21:38

Je peux te transmettre ce fichier demain (il est sur le PC de l'entreprise ou je fais mon stage)

Concernant le CSV, il sera exporté par excel et peut-être retravaillé pour s'adapter à une éventuelle solution (c'est donc au choix, ou un format liste ou un format matrice)

Pour info, il s'agit d'un nuage d'environ 500 points !

iznogoud

Nombre de messages : 6
Age : 35
Localisation : Strasbourg
Date d'inscription : 19/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Mer 19 Nov - 23:09

Bon voilà un premier essai,

Comme je n'ai pas de fichier csv pour tester, je m'en suis fabriqué un avec la macro suivante:

Code:

{macro write()}
[OpenFile("test.dat"),
 for y from -5 to 5 step 0.25 do  {41 points pour y}
    for x from -5 to 5 step 0.25 do  {41 points pour x}
        WriteFile([x," ",y," ",f(x,y)," 0"])
    od
 od,
 CloseFile()]     

Il enregistre les points de la surface z=f(x,y) où f est une fonction (=macro) de deux variables , sur chaque ligne on a donc: x y z 0, le 0 est indispensable car dans la version actuelle, TeXgraph lit les données par deux (il lit des complexes en fait).

Ensuite j'ai créé un élément graphique Utilisateur avec la commande:

Code:

[ stock:=load(41,41,"test.dat"),
 transformbox3d( rectangle3d(stock)),
 DrawFacet(stock,[color:=steelblue]) ] 

La macro load (décrite ci-après) charge le fichier en indiquant le nombre de points pour x et pour y, dans la variable stock, calcule la matrice 3D pour adapter la fenêtre 3D au graphique, et dessine les facettes contenues dans stock.

Voici la macro load:

Code:

[$nx:=%1, $ny:=%2,
 stock1:=ReadData(%3),
 $F:= for $J from 1 to ny-1 do
          for $I from 1 to nx-1 do
            $num:= (J-1)*nx+I ,
            num, num+1, num+nx+1,num+nx, jump
          od,
      od,
 MakePoly(stock1, F) ]

elle charge le fichier dans stock1 (c'est la liste des sommets en fait), puis construit la liste des facettes avec les numéros des sommets, et enfin renvoie la liste des facettes (MakePoly) avec les coordonnées des sommets.

J'ai testé avec la fonction f(x)=3exp(-x^2-y^2) , c'est à dire la macro:

Code:

{f(x,y)}
3*exp(-%1^2-%2^2)

ce qui donne ceci:

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

WOUAH

Message  iznogoud le Jeu 20 Nov - 0:40

WOUAH, je ne dirai qu'une chose WOUAH !!!

Un grand merci pour cette solution super rapide !!!!

Etant donné la grande aisance avec laquelle tu as trouvé cette astuce, je me permet d'ajouter une autre demande : je souhaite colorer cette surface automatiquement pour faire apparaitre des lignes de niveau (en bref, plus la couleur est chaude, plus ma coordonnée est forte) et faciliter la lecture...

WOUAH !!!!

iznogoud

Nombre de messages : 6
Age : 35
Localisation : Strasbourg
Date d'inscription : 19/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Jeu 20 Nov - 1:24

Là c'est un peu plus délicat, il faut travailler au niveau des facettes, on les trie, on les prend ensuite une par une pour les colorier. Avec la version 1.94-beta-7.2, on change l'élément graphique de mon précédent message par celui-ci:

Code:

[ palette:=[purple, blue,  green,  yellow, orange,  red, crimson],
 stock:=load(41,41,"test.dat"),
 transformbox3d( rectangle3d(stock)),
 stock:=SortFacet(stock), FillStyle:=full,
 Ligne3D(
          for facette in stock By jump do
              cote:= 5*(Zde(isobar3d(facette))-Zinf)/(Zsup-Zinf),
              $k:=Ent(cote), $c1:=palette[k+1], $c2:=palette[k+2],
              if c2=Nil then c2:=c1 fi, $t:=cote-k,
              facette, Re(jump)+i*(2+MixColor(c1,1-t,c2,t))
          od,1)
]

Pour grossir un peu l'image j'ai pris la fonction f(x,y)=3exp((-x^2-y^2)/5):


_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Ven 21 Nov - 1:14

Bonsoir iznogoud,

J'ai bien reçu ton mail avec le fichier test.dat, il suffisait en fait de remplacer les caractères " par des espaces. Mais je n'ai pas eu la bonne figure tout de suite à cause de ma macro load qui ne parcourait pas la liste dans le bon ordre, j'ai donc changé cette macro en inversant les deux boucles imbriquées. Il restait encore un petit problème, il fallait mettre 11 points en Y et non pas 41. Voilà, j'ai mis le fichier teg rectifié et le fichier de données dans cette archive: isnogoud.zip

Ca me donne ceci:
j'espère que cela correspond à ce que tu attends!

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Sam 22 Nov - 13:15

Bon, plus de nouvelles? Dommage, c'était un sujet intéressant...

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  iznogoud le Sam 22 Nov - 13:59

Je suis de retour !

Le résultat est à la hauteur de mes espérances. C'est exactement ce qu'il me fallait, mon objectif est atteint à 99,9%. Le 0,1% restant est l'inclusion d'une légende des couleurs (une broutille par rapport àau travail déjà réalisé)

J'ai également une question plus "système", j'ai du modifié légèrement l'environnement utilisateur en spécifiant le chemin complet de mon fichier test.dat.

Cela est-il normal, ou puis-je associer le chemin au niveau du fichier teg ? (pour info, je suis sous ubuntu)

Merci 1000 fois, le résultat est superbe, bien mieux qu'avec le logiciel que j'avais utilisé au début : excel

iznogoud

Nombre de messages : 6
Age : 35
Localisation : Strasbourg
Date d'inscription : 19/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Sam 22 Nov - 15:51

Bonjour iznogoud,

J'ai cru un moment que tu avais abandonné la partie...

pour la légende je te propose de modifier l'élément graphique comme ceci:

Code:

[view(-5.5,8,-5.5,5),
 palette:=[purple, blue,  green,  yellow, orange,  red, crimson],
 stock:=load(41,11,"test.dat"),
 transformbox3d( rectangle3d(stock)),
 stock:=SortFacet(stock), FillStyle:=full,
 Ligne3D(
          for facette in stock By jump do
              cote:= 6*(Zde(isobar3d(facette))-Zinf)/(Zsup-Zinf),
              $k:=Ent(cote), $c1:=palette[k+1], $c2:=palette[k+2],
              if c2=Nil then c2:=c1 fi, $t:=cote-k,
              facette, Re(jump)+i*(2+MixColor(c1,1-t,c2,t))
          od,1),
 {légende}
 h:=0.5, dep:=5.5+i*(Ymin),
 LineStyle:=noline, FillStyle:=full, Zpas:=(Zsup-Zinf)/7, z1:=Zinf+Zpas/2,
 LabelStyle:=left,
 for k from 1 to 6 do
  FillColor:=palette[k],
  Inc(dep, i*3*h/2), Dcarre(dep,dep-i*h,1),
  Label(dep+3*h/2-i*h/2, ["$z=",Round(z1,2),"$"]),
  Inc(z1,Zpas)
 od
]

ce qui normalement ceci:

Quant au chemin, il n'y a pas de problème pour le mettre, chez moi par exemple j'ai ceci:

stock:=load(41,11,"/home/pfradin/test.dat"). Sinon TeXgraph cherche dans le répertoire par défaut et ça tu dois pouvoir le modifier dans la config du programme (menu Paramètres/Fichier config), cela nécessite un redémarrage.

D'ailleurs cela soulève une question: quand on charge un fichier, le répertoire de celui-ci doit-il devenir le répertoire courant, ou bien doit-on toujours garder le répertoire de travail comme répertoire courant?

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  iznogoud le Sam 22 Nov - 16:50

Concernant le répertoire par défaut, il serait préférable (je pense, donc çà vaut ce que çà vaut !) qu'il cherche dans le même répertoire que le fichier teg. Je suis habitué à la fonction \include de Latex (par défaut, le répertoire du fichier source, ou dossier plus haut si spécifié (ex :dossier/test.dat) ou chemin complet (ex: /dossier1/dossier2/test.dat)

Concernant ma surface, c'est "impec", je vais encore contrôler les couleurs et définir moi même les plages pour les couleurs (surtout pour avoir des chiffres ronds), un repère bien placé et hop dans mon mémoire d'ingénieur Latex

iznogoud

Nombre de messages : 6
Age : 35
Localisation : Strasbourg
Date d'inscription : 19/11/2008

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  P.Fradin le Sam 22 Nov - 17:06

Bon, voilà un fil que se termine bien alors! S'il y a le moindre soucis pour les modifications, n'hésite pas!

_________________
P.Fradin

P.Fradin
Admin

Nombre de messages : 1133
Age : 55
Date d'inscription : 19/01/2008

Voir le profil de l'utilisateur http://texgraph.tuxfamily.org/

Revenir en haut Aller en bas

Re: Réaliser une surface suivant un nuage de points

Message  Contenu sponsorisé Aujourd'hui à 11:52


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum