IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

algorithme de streamlines cSharp


Sujet :

C#

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut algorithme de streamlines cSharp
    bonjour

    Je viens à la pêches aux connaissances !

    Je dois dessiner des streamlines a partir d'une matrice X*Y de vecteurs de vent.
    Pour chaque cellule je connais l'angle et l'intensité du vent

    Je sens que je vais un peu ramer pour avoir un résultat visuellement agréable (creer de vraies streamlines et non une suite de bouts de droites mal allignés

    Comme je dois écrire cela en cSharp, je viens voir si par hazard quelqu'un ici aurait de l'expèrience ou des conseils a donner dans le domaine

    Merci de votre aide
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Voir : http://www.codeproject.com/Articles/...f-D-Points-wit
    Quelques mots clés pour une recherche Google : smoothing curve spline beziers cubic interpolation
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Grafito

    Heureux de te lire (j'étais presque certain que tu te manifesterais)

    Mais le premier soucis que je cherche a résoudre c'est de trouver le "truc" pour creer mes polylines.
    Dans l'image jointe tu peux voir que je pars d'une grille pour laquelle a chaque cellule j'ai les composante de la force du vent en X et Y

    Ca me permet donc a chaque cellule de calculer le vecteur correspondant mais dans le cadre de la cellule

    Le premier challenge a résoudre, c'est de creer des vecteurs qui se prolongent d'une cellule a l'autre de maniere continue

    Je pressent qu'il doit y avoir un algorithme relativement simple pour faire cela

    Mais l'illumination ne m'est pas encore venue

    Je cherche
    Images attachées Images attachées  
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Le problème s'apparente à la conversion de modèles de terrains numérisés en courbes de niveaux.
    Il y a differents algorithmes pour cela.

    Tu trouveras la présentation d'un algorithme avec une implémentation en C# de la routine de contour ici:
    http://paulbourke.net/papers/conrec/


    Oups mauvaise réponse : Dans les cellules, ce ne sont pas des valeurs scalaires, mais des vecteurs.

    Il y a une représentation simple qui consiste à tracer dans chaque rectangle une flêche avec les caractéristiques suivantes :
    • origine : centre du rectangle,
    • direction : celle du vecteur,
    • longueur : 1/2 diagonale,
    • épaisseur ou couleur suivant la norme du vecteur.
      On devrait pouvoir améliorer cette representation en éliminant une partie des flêches dès lors qu'elles sont entourées de flêches "semblables".
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci pour ta collaboration intellectuelle Grafito

    De fait un algo de type Marching Square n'est pas de mise ici puisque on part de vecteurs !

    Ca peut paraitre plus simple mais pas certain quand meme

    Dans l'exemple joint je suis parti de ton idée mais en prenant comme origine soit le point inférieur gauche ou droit selon l'orientation
    Je pense que ta proposition donnera +/- le meme résultat

    A mon avis la solution c'est de "parcourrir" le vecteur cellule par cellule en prenant comme origine chaque fois l'extremité du segment précédant
    C'est pas non plus évident car il faur prendre un nouveau départ a chaque sortie de piste

    Je continue !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Graffito

    Je m'adresse evidemment a tout le monde mais je sais Grafito que tu a quelques ressources dans le présent domaine

    J'ai résolu mon probleme de Lines en mettant en place un algorithme de parcours de mes cellule qui prends comme origine l'intesection avec le vecteur de la cellule précédante
    Il y a plusieurs subtilité mais j'obtiens finalement un resultat accecpable

    Sauf Que ! : Je calcule chacun des vecteurs avec une resolution de droite du premier degré Y=aX+b ou A est calculé en fonction des composantes u et v du vent, ces composabntes u et v sont données a chaque cellules

    Je pense que le calcul reel est un peu plus complexe mais je n'ai pas bien réussi a interpreter la littérature sur le sujet je cherche donc la recette de cuisine (ou plutot l'expression concrete de la formule) qui sur base sur les parametres connu
    1- Coordonnées et dimension d'une cellule
    2- Composante uV et vV de vitesse du vent
    3- Données des cellules adjacentes

    Me permet de calculer des points de passage du streamline dans ma cellule

    C'est sans doute plus mathématique que Csharp mais je dois l'écrire en cSharp

    Merci de votre aide
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    le parcours de mes cellule prend comme origine l'intesection avec le vecteur de la cellule précédante
    On devrait légérement améliorer les résultats ainsi :
    Dans le cas d'une intersection I[i+x,j] sur le segment P[i,j]---P[i+1,j], on peut extrapoler u et v :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uI=u[i,j]+x*(u[i+1,j]-u[i,j]) ;
    vI=v[i,j]+x*(v[i+1,j]-v[i,j]) ;
    idem pour les inserctions sur d'autres cotés.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Graffito

    Oui je pense que tu a raison
    Mais si j'ai bien compris ton idée ca va pas etre simple

    Car acuellement j'ai un coefficient A par cellule donné par u/v
    Et en fonction du coefficiant, je teste quel est le coté secant avec la droite
    Dans ce que tu suggere j'aurais un A dépendant du coté élu pour le test

    Ou j'ai rien compris ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    ca va pas etre simple
    C'est juste une correction à apporter au vecteur vitesse en fonction du point de départ du vecteur.

    Pour être plus précis, il faudrait savoir si quand tu appliques ton calcule sur les carré, les valeurs de la vitesse correspondent au centre des carrés ou aux intersections de la grille.
    Suivant le cas, on appliquera une interpolation simple (sommet des carrés) ou bilinéaire (grille).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour Graffito

    Merci pour ton aide, j'apprécie beaucoup.

    Actuellement je considere que l'origine des vitesse d'un rectangle est sur le coin inférieur gauche
    Mais ce serait intéressant d'essayer une interpolation bilinéaire en partant du centre

    Sans vouloir abuser et si tu veux jouer aussi un peu je t'envoie ci-joint le code complet

    La methode que j'ai écrit pour faire le calcul dans UNE cellule sans tenir compte des cellules adjacentes est DrawOneStreamSegment(..
    Et c'est sans doute là qu'il faut agir
    Fichiers attachés Fichiers attachés
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  11. #11
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Mais si j'ai bien compris ton idée ca va pas etre simple
    En effet, tes calculs et ton tracé sont basés sur des objets C_StreamCell qui ne connaisent pas les cellules voisinnes.
    On pourrait agréger dans la classe C_StreamCell 9 objets C_StreamCell associés aux C_StreamCells voisines.
    Ce qui permettrait d'effectuer une extrapolation bilinéaire sur la cellule et les 3 voisines en fonction de la position de "Origin" sur le bord de la cellule, soit :
    pour A : [1,2,4,0]
    pour B : [2,3,0,5]
    ...
    pour H : [0,5,7,8]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    +----------+-----------+-----------+
    |          |           |           |
    |          |           |           |
    |    1     |     2     |    3      |
    |          |           |           |
    |          |           |           |
    +----------+--A--*--B--+-----------+
    |          C     *     D           |
    |          |     *     |           |
    |    4     ***** 0 *****    5      |
    |          E     *     F           |
    |          |     *     |           |
    +----------+--G--*--H--+-----------+
    |          |           |           |
    |          |           |           |
    |    6     |     7     |    8      |
    |          |           |           |
    |          |           |           |
    +----------+-----------+-----------+
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Graffito

    Je pense que c'est effectivement la bonne voie
    Excuse moi pour le délai de réaction, j'ai été debordé par d'autres urgences

    Je vais me pencher la dessus maintenant
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

Discussions similaires

  1. Formalisation graphique des algorithmes
    Par David R. dans le forum Algorithmes et structures de données
    Réponses: 14
    Dernier message: 08/12/2012, 10h21
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    Réponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme génétique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo