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

Simulation Discussion :

Maillage 2D d'un béton avec des granulats de formes rondes de tailles différentes


Sujet :

Simulation

  1. #1
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut Maillage 2D d'un béton avec des granulats de formes rondes de tailles différentes
    Bonjour,

    Je vous demande comment je peux créer un maillage d'un carré qui représente un échantillon de béton de taille 5cm * 5cm qui contient des granulats comme éléments rondes de tailles différentes aléatoires entre 2 et 10 mm par Matlab.

    Merci pour votre aide
    Images attachées Images attachées  

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour

    As-tu commencé à coder quelque chose? bloques-tu sur un point en particulier? Comment pouvons nous t'apporter notre aide autrement qu'en le faisant à ta place?

    Je vois plusieurs étapes à effectuer:
    • Créer un carré d'une couleur
    • Créer des cercles à l'intérieur d'une autre couleur de diamètre borné mais aléatoire
    • Vérifier que les cercles n'ont pas de points en communs

    Je suppose qu'il y a différentes façon de procéder et je ne connais personnellement pas qu'elle serait l'optimale. Dis-nous en plus.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  3. #3
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour votre réponse. En fait je ne sais pas comment il faut commencer avec un tel problème. Je souhaite faire tous les points que vous avez mis:

    - carré qui représente le béton.
    - les diamètres aléatoires sans aucun intersection qui représente les granulats
    - la couleur a l’intérieur représente la pâte de ciment.

    Merci

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bon, commençons par le commencement.

    Je pense que la fonction patch pourra t'aider dans ta tâche. Je t'invite à aller te documenter dessus.
    Commençons déjà par la création d'un bloc gris. Voici une méthode qui utilise l'objet/fonction patch:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    x = [0 1 1 0];
    y = [0 0 1 1];
    figure;
    p=patch(x,y,[0.8, 0.8, 0.8]);
    Voici la procédure pour y inclure un cercle blanc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    theta = 0:0.01:2*pi;
    rayon = 0.2;
    myCircle_X = rayon*cos(theta)+0.5;
    myCircle_Y = rayon*sin(theta)+0.5;
    C1 = patch(myCircle_X,myCircle_Y,[1 1 1]);
    Je te laisse intégrer ça pour commencer, j'attends ton retour.

    Edit: et un petit axis equal pour que les cercles soient bien rond à l'oeil
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  5. #5
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup, je veux essayer maintenant.

  6. #6
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    La fonction patch ne peut fonctionner que pour 2 paramètres de données en créant un seul cercle et moi je veux choisir plusieurs cercles qui désignent les granulats dans le béton.
    Toujours j'arrive a une erreur d’exécution de cette commande quand je veux plusieurs cercles .

    Merci

  7. #7
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bizarre.

    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
    20
    21
    >> figure;
    >> x = [0 1 1 0];
    y = [0 0 1 1];
    figure;
    p=patch(x,y,[0.8, 0.8, 0.8]);
    >> theta = 0:0.01:2*pi;
    rayon = 0.2;
    myCircle_X = rayon*cos(theta)+0.5;
    myCircle_Y = rayon*sin(theta)+0.5;
    C1 = patch(myCircle_X,myCircle_Y,[1 1 1]);
    >> axis equal
    >> theta = 0:0.01:2*pi;
    rayon = 0.05;
    myCircle_X = rayon*cos(theta)+0.8;
    myCircle_Y = rayon*sin(theta)+0.8;
    C2 = patch(myCircle_X,myCircle_Y,[1 1 1]);
    >> theta = 0:0.01:2*pi;
    rayon = 0.1;
    myCircle_X = rayon*cos(theta)+0.5;
    myCircle_Y = rayon*sin(theta)+0.2;
    C3 = patch(myCircle_X,myCircle_Y,[1 1 1]);
    Nom : granulat_beton.png
Affichages : 249
Taille : 12,4 Ko



    Peux-tu nous montrer ce que tu as fait?
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  8. #8
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    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
    x =  [0 50 50 0];       % comme mon béton est de 50*50 mm2 de surface %
    >> y= [0 0 50 50];     % comme mon béton est de 50*50 mm2 de surface %
    >> figure;
    >> theta = [0 pi/2 3*pi/4 pi];   % pour avoir la même taille de la matrice de x et y%
    >> rayon1 = 2.5;                    % premier granulat de diamètre 2.5 mm %
    >> rayon2 = 5;                       % deuxième granulat de diamètre 5 mm %
    >> rayon3 = 7.5;                     % troisième granulat de diamètre 7.5 mm %
    >> rayon4 = 10;                      % quatrième granulat de diamètre 10 mm %
    >> myCircle_X1 = rayon1*cos(theta)+0.5;
    >> myCircle_Y1 = rayon1*sin(theta)+0.5;
    >> myCircle_X2 = rayon2*cos(theta)+0.5;
    myCircle_Y2 = rayon2*sin(theta)+0.5;
    >> myCircle_X3 = rayon3*cos(theta)+0.5;
    myCircle_Y3 = rayon3*sin(theta)+0.5;
    >> myCircle_X4 = rayon4*cos(theta)+0.5;
    myCircle_Y4 = rayon4*sin(theta)+0.5;
    >> P=patch(x,y, myCircle_X1, myCircle_Y1, myCircle_X2, myCircle_Y2, myCircle_X3, myCircle_Y3, myCircle_X4, myCircle_Y4);

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Comme dans mon exemple, il faut créer plusieurs objets patchs.

    PS1: si tu veux un beau cercle, je te conseille de prendre plus de points sur theta. Définis le entre 0 et 2Pi avec un petit pas.
    PS2: le +0.5 qu'y est ajouté aux équations donne les coordonnées du centre du cercle. Dans ton exemple, tu auras tout tes cercles centrés au même point, ce qui n'est pas ce que tu veux.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  10. #10
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    D'accord c'est bon mais dans ce cas c'est moi qui veut choisir :

    - les nombres des granulats
    - leurs tailles
    - leurs positions.

    Mais ce que je veux ; est de faire un tirage aléatoire des granulats de taille entre 2.5 et 10 mm de sorte qu'il n'aurait pas d'intersections entre les granulats. Je sais que c'est compliqué mais je n'arrive plus. J'essaie toujours de rentrer ces paramètres chacun à part mais ce n'est pas pratique. Est-ce que je peux utiliser une fonction rand qui me donne un maillage randomly?

    Merci et je m'excuse si je vous dérange

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bon...
    Estimes-toi très chanceux car ce n'est pas du tout dans la politique du forum de faire le travail à la place des gens. Je ne sais pas pourquoi je l'ai fait, mais sache que ça sera l'unique exception que tu rencontreras ici. Je t'ai donné suffisamment d'indices pour que tu puisses au moins essayer de faire le travail par toi même; cela dit, tu n'as pas faire montrer de beaucoup de volonté.

    Voici un script pas du tout optimisé (qui prendra assez longtemps) qui fait ce que tu demandes.

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    x = [0 50 50 0];
    y = [0 0 50 50];
    figure;
    p=patch(x,y,[0.8, 0.8, 0.8]);
    
    theta = 0:0.01:2*pi;
    nombre_granulats = 50;
    myCircles = cell(0,0);
    for p = 1:nombre_granulats
        
        inclusion = 0;
        stack = 1;
        while ( inclusion == 0)
            %% création d'un rayon aux dimension souhaité:
            rayon = 0;
            if stack > 79
                stack = 79;
            end
            while ( rayon < 2 || rayon > 10 - stack*0.1 )
                rayon = rand*10;
            end
            
            %% détermination du centre du cercle
            bornes = [50-rayon,rayon];
            xCentre = 0;
            while ( xCentre < bornes(2) || xCentre > bornes(1) )
                xCentre = 50*rand;
            end
            yCentre = 0;
            while ( yCentre < bornes(2) || yCentre > bornes(1) )
                yCentre = rand*50;
            end
            
            %% vérification de non inclusion avec un autre cercle.
            myCircle_X = rayon*cos(theta)+xCentre;
            myCircle_Y = rayon*sin(theta)+yCentre;
            for q = 1:size(myCircles,1)
                test = inpolygon(myCircle_X,myCircle_Y,myCircles{q,1},myCircles{q,2});
                if ~isempty(find(test))
                    inclusion = 1;
                end
            end
            
            if inclusion == 0
                patch(myCircle_X,myCircle_Y,[1 1 1]);
                drawnow
                myCircles{end+1,1} = myCircle_X;
                myCircles{end,2} = myCircle_Y;
                inclusion =1;
            else
                inclusion = 0;
            end
        end   
        
    end
    PS: le code n'est vraiment pas optimisé (pas la bonne méthode), donc si tu mets un grand nombre de granulats, la probabilité pour qu'il trouve sa place dans le maillage devient très faible. Baisse le nombre de granulats ou interromps le script en court de route si tu ne veux pas attendre trop longtemps (pour rappel on peu interrompre un script en faisant la combinaison de touche CTRL + C dans la command window de MATLAB).

    EDIT: j'ai fait une première modif sur le code. Pour optimiser un peu (beaucoup) plus, il faut travailler sur les conditions de placement du centre du cercle conjointement avec la taille du rayon.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  12. #12
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Je vous remercie pour votre message. En fait ce n'est pas une idée que je ne travaille pas . Je suis débutant et j'essai chaque jour d'apprendre des commandes et des fonctions pour améliorer mon travail. Je vais essayer maintenant avec ce code. Merci pour votre compréhension

    Juste quelques questions pour bien comprendre le code:

    - Je vois toujours la variable stack constante et égale a 1. Son but est juste que le rayon ne soit pas maximum c'est ça?
    - quel est l’intérêt du cell de mycircles et le end dans la dernière commande mycircles{end+1,1} c'est quoi end?
    Merci

  13. #13
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Citation Envoyé par Achour92 Voir le message
    Bonjour,

    Je vous remercie pour votre message. En fait ce n'est pas une idée que je ne travaille pas . Je suis débutant et j'essai chaque jour d'apprendre des commandes et des fonctions pour améliorer mon travail. Je vais essayer maintenant avec ce code. Merci pour votre compréhension
    Bonjour,
    Oui j'étais pas très bien luné quand je t'ai répondu, mea culpa. Par contre, si tu désires progresser il faut que tu essaies d'écrire des morceaux de code, même si ils sont faux, que tu tâtonnes même et que tu poses des questions; il faut participer à la création de ton code pour bien le comprendre et montrer ta bonne volonté.

    Citation Envoyé par Achour92 Voir le message
    - Je vois toujours la variable stack constante et égale a 1. Son but est juste que le rayon ne soit pas maximum c'est ça?
    J'ai introduit la variable stack afin de favoriser les granulats de petites dimensions au fur et à mesure du remplissage de ton maillage. En fait, si l'algorithme échoue à placer le cercle dans le maillage, on va réduire le rayon du prochain potentiel granulat afin qu'il ait plus de chance de trouver sa place dans le maillage. On limite la valeur de stack à 79 afin de garder le rayon soit au pire égal à 2mm. J'ai cependant oublié d'incrémenter la variable stack afin que cette considération soit prise en compte (et que donc le maillage se remplisse beaucoup plus vite. voici le code corriger.
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    x = [0 50 50 0];
    y = [0 0 50 50];
    figure;
    p=patch(x,y,[0.8, 0.8, 0.8]);
     
    theta = 0:0.01:2*pi;
    nombre_granulats = 50;
    myCircles = cell(0,0);
    for p = 1:nombre_granulats
     
        inclusion = 0;
        stack = 1;
        while ( inclusion == 0)
            %% création d'un rayon aux dimension souhaité:
            rayon = 0;
            if stack > 79
                stack = 79;
            end
            while ( rayon < 2 || rayon > 10 - stack*0.1 )
                rayon = rand*10;
            end
     
            %% détermination du centre du cercle
            bornes = [50-rayon,rayon];
            xCentre = 0;
            while ( xCentre < bornes(2) || xCentre > bornes(1) )
                xCentre = 50*rand;
            end
            yCentre = 0;
            while ( yCentre < bornes(2) || yCentre > bornes(1) )
                yCentre = rand*50;
            end
     
            %% vérification de non inclusion avec un autre cercle.
            myCircle_X = rayon*cos(theta)+xCentre;
            myCircle_Y = rayon*sin(theta)+yCentre;
            for q = 1:size(myCircles,1)
                test = inpolygon(myCircle_X,myCircle_Y,myCircles{q,1},myCircles{q,2});
                if ~isempty(find(test))
                    inclusion = 1;
                end
            end
    
            stack =  stack + 1; % Ajout de l'incrémentation du stack.
    
            if inclusion == 0
                patch(myCircle_X,myCircle_Y,[1 1 1]);
                drawnow
                myCircles{end+1,1} = myCircle_X;
                myCircles{end,2} = myCircle_Y;
                inclusion =1;
            else
                inclusion = 0;
            end
        end   
     
    end
    Citation Envoyé par Achour92 Voir le message
    - quel est l’intérêt du cell de mycircles et le end dans la dernière commande mycircles{end+1,1} c'est quoi end?
    Le tableau de cellules myCircles est utilisé afin de garder en mémoire les "coordonnées" des granulats précédemment ajoutés au maillage. Cette mise en mémoire est utilisé ensuite afin de vérifier l'inclusion des futurs granulats dans les précédents granulats. En clair, à chaque création d'un nouveau granulat, on vérifie qu'il n'est inclus dans aucun granulats qui sont stockés dans myCircles.
    Le end de myCircles{end+1,1} signifie "le dernier élément de myCircles". Donc quand on effectue myCircles{end+1,1}, on ajoute une case après la dernière case de notre tableau de cellules myCircles. end, pour fin, est utilisé sur matlab dans les tableaux afin de récupérer le dernier élément du dit tableau.

    Si tu as d'autres questions n'hésites pas. N'oublie pas de corriger l'incrémentation du stack dans ton code comme je l'ai fait afin d'améliorer significativement la vitesse d'exécution de ton script.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  14. #14
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Pour montrer l'effet de l'interface des granulats dans mon modèle, j'ai amélioré le code en creant pour chaque cercle un cercle de meme centre mais de rayon R+0.2 et j'ai obtenu le résultat suivant .
    Ma question est: est-ce que je peux par Matlab colorier la région entre les 2 cercles?

    Merci et voici le code:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    x = [0 50 50 0];
    y = [0 0 50 50];
    figure;
    p=patch(x,y,[0.8, 0.8, 0.8]);
    theta = 0:0.01:2*pi;
    nombre_granulats =50;
    myCircles1 = cell(0,0);
    myCircles = cell(0,0);
    for p = 1:nombre_granulats
        inclusion = 0;
        stack = 1;
        while  (inclusion == 0)
            %% création d'un rayon aux dimension souhaité:
            rayon = 0;
            rayon1 =0;
            if stack > 29
                stack = 29;
            end
            while (rayon1 < 1.25 || rayon1 > 5 - stack*0.1 )
                rayon = rand*5;
                rayon1 = rayon+0.2;
            end
            %% détermination du centre du cercle
            bornes = [50-rayon1,rayon1];
            xCentre = 0;
            while (xCentre < bornes(2) || xCentre > bornes(1)  )
                xCentre = 50*rand;
            end 
            yCentre = 0;
            while ( yCentre < bornes(2) ||  yCentre> bornes(1) )
                yCentre = rand*50;
            end
            %% vérification de non inclusion avec un autre cercle.
            myCircle_X = rayon*cos(theta)+xCentre;
            myCircle_Y = rayon*sin(theta)+yCentre;
            myCircle_X1 = rayon1*cos(theta)+xCentre;
            myCircle_Y1 = rayon1*sin(theta)+yCentre;
            for q = 1:size(myCircles1,1)
                test = inpolygon(myCircle_X1,myCircle_Y1,myCircles1{q,1},myCircles1{q,2});
                if ~isempty(find(test))
                    inclusion = 1;
                end
            end
            stack =  stack + 1; % Ajout de l'incrémentation du stack.
            if inclusion == 0
                patch(myCircle_X1,myCircle_Y1,[1 1 1]);
                drawnow
                myCircles1{end+1,1} = myCircle_X1;
                myCircles1{end,2} = myCircle_Y1;
                 patch(myCircle_X,myCircle_Y,[1 1 1]);
                inclusion =1;
            else
                inclusion = 0;
            end
        end
    end

  15. #15
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Ce que tu peux éventuellement faire, c'est commencer par dessiner le patch le plus grand, puis dessiner le plus petit par dessus. ça fera la même chose que ce que tu demandes.
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  16. #16
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    c'est parfait couleur bleu pour le grand cercle et blanc pour le petit
    merci bien

  17. #17
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    voiciNom : interface.png
Affichages : 242
Taille : 14,1 Ko

  18. #18
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut Maillage des éléments triangulaires
    Bonjour,
    Afin de terminer mon problème de maillage de l’échantillon du béton, j'ai crée une fonction maillage que vous m'avez proposé pour faire un tirage aléatoire des granulats, j'ai ajouté a cette fonction une commande pour créer les interfaces et de me retourner les paramétrés suivants:
    - Le dessin des granulats
    - Une matrice Cercle qui me donne toutes les coordonnées de mes cercles(x,y) et les rayons

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    function [CERCLE]= maillage(n)
    x = [0 50 50 0];
    y = [0 0 50 50];
    figure;
    p=patch(x,y,[0.8, 0.8, 0.8]);
    theta = 0:0.01:2*pi;
    nombre_granulats =n;
    myCircles1 = cell(0,0);
    myCircles = cell(0,0);
    CERCLE=zeros(3,n);
    for p = 1:nombre_granulats
        inclusion = 0;
        stack = 1;
        while  (inclusion == 0)
            %% création d'un rayon aux dimension souhaité:
            rayon = 0;
            rayon1 =0;
            if stack > 29
                stack = 29;
            end
            while (rayon1 < 1.25 || rayon1 > 5 - stack*0.1 )
                rayon = rand*5;
                rayon1 = rayon+0.1;
               CERCLE(3,p)=rayon;
            end
            %% détermination du centre du cercle
            bornes = [50-rayon1-1,rayon1+1];
            xCentre = 0;
            while (xCentre < bornes(2) || xCentre > bornes(1)  )
                xCentre = 50*rand;
                 CERCLE(1,p)=xCentre;
            end 
            yCentre = 0;
            while ( yCentre < bornes(2) ||  yCentre> bornes(1) )
                yCentre = rand*50;
                 CERCLE(2,p)=yCentre;
    
            end
            %% vérification de non inclusion avec un autre cercle.
            myCircle_X = rayon*cos(theta)+xCentre;
            myCircle_Y = rayon*sin(theta)+yCentre;
            myCircle_X1 = rayon1*cos(theta)+xCentre;
            myCircle_Y1 = rayon1*sin(theta)+yCentre;
            for q = 1:size(myCircles1,1)
                test = inpolygon(myCircle_X1,myCircle_Y1,myCircles1{q,1},myCircles1{q,2});
                if ~isempty(find(test))
                    inclusion = 1;
                end
            end
            stack =  stack + 1; % Ajout de l'incrémentation du stack.
            if inclusion == 0
                patch(myCircle_X1,myCircle_Y1,'blue');
                drawnow
                myCircles1{end+1,1} = myCircle_X1;
                myCircles1{end,2} = myCircle_Y1;
                 patch(myCircle_X,myCircle_Y,'white');
                inclusion =1;
            else
                inclusion = 0;
            end
        end
    end
    end
    Appel à cette fonction par exemple En plus j'ai trouvé une fonction dans matlab qui me permet de faire un maillage triangulaire en 2D d'un carré de dimensions 50*50

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    function [S,T,RS,RT]=triangule_carre(m,n,ref_bord,ref_mat) % T= nombre des éléments du maillage, S= coordonnées des noeuds, m= nombre des éléments suivant x, n suivant y%
    %initialisation
    dx=50/m;
    dy=50/n;
    x=0:dx:50.;
    y=0:dy:50.;
    nbs=(m+1)*(n+1);
    nbt=2*m*n;
    RS=zeros(1,nbs);
    RT=ref_mat*ones(1,nbt);
    %definition des sommets
    [X,Y]=meshgrid(x,y);
    S=[reshape(X',nbs,1) reshape(Y',nbs,1)];
    %definition de la numerotation des triangles
    N1=[];N2=[];
    mp=m+1;
    for i=1:m
    if(mod(i,2)==1) %i impair
    N1=[N1 i i+1 mp+i i+1+mp i+mp i+1];
    else %i pair
    N1=[N1 i+1 i+1+mp i i+mp i i+1+mp];
    end
    end
    N1=reshape(N1,3,2*m)';
    mp=m+1;
    for i=1:m
    if(mod(i,2)==1) %i impair
    N2=[N2 i+1 i+1+mp i i+mp i i+1+mp];
    else %i pair
    N2=[N2 i i+1 mp+i i+1+mp i+mp i+1];
    end,
    end,
    N2=reshape(N2,3,2*m)';
    T=[];
    for j=1:n
    if(mod(j,2)==1) 
     T=[T;N1+(j-1)*mp];
    else
    T=[T;N2+(j-1)*mp];
    end
    end
    %reference des bords
    RS(1:mp)=ref_bord(1);
    RS(mp:mp:end)=ref_bord(2);
    RS(n*mp+1:end)=ref_bord(3);
    RS(1:mp:end)=ref_bord(4);
    end
    Appel à cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [S,T,RS,RT] = triangule_carre(20,10,[1 2 3 4],10);
    triplot( T,S(:,1),S(:,2),'k')
    Mon but maintenant est de combiner ces deux fonctions pour mailler ma structure au début sans avoir des triangles à l’intérieur des granulats du petit rayon.

    Est-ce que vous pouvez me proposer des idées?

    Merci beaucoup pour votre aide

  19. #19
    Modérateur

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Août 2014
    Messages
    1 295
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2014
    Messages : 1 295
    Points : 2 385
    Points
    2 385
    Par défaut
    Bonjour,

    Je n'ai pas très bien compris la demande, peux-tu apporter un peu plus d'explications? Eventuellement imagé? Tu souhaites incorporer tes granulats dans un quadrillage?
    Si vous cherchez des réponses sur ce forum il faudra avant tout expliquer clairement votre problème et exposer la démarche que vous avez entreprise pour le résoudre. Fournissez une base de travail et de réflexion à vos interlocuteurs!

  20. #20
    Candidat au Club
    Homme Profil pro
    Doctorant génie civil
    Inscrit en
    Novembre 2015
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Doctorant génie civil
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2015
    Messages : 18
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    en fait je vais introduire les éléments triangles dans mon modèle à l’extérieur du petit granulat (petit cercle) car mon granulat est imperméable. J'ai fait celui d'un carré et j'ai obtenu les coordonnées des nœuds. En conclusion je veux obtenir comme celle de la photo suivante.

    Merci Nom : triang.png
Affichages : 224
Taille : 326,0 Ko

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/08/2012, 09h05
  2. Réponses: 27
    Dernier message: 03/02/2003, 12h27
  3. créer un noeuds avec des paramétres
    Par Toxine77 dans le forum XMLRAD
    Réponses: 5
    Dernier message: 21/01/2003, 16h11
  4. Réponses: 2
    Dernier message: 06/12/2002, 07h50
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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