Bonjour à tous,
J'ai besoin d'aide dans la réalisation d'un programme sous Matlab. Celui-ci permet d'abord de réaliser un maillage reliant des points créés aléatoirement. Ensuite il permet de classer les mailles créées par ordre d'aires croissantes. Enfin en créant un deuxième maillage, il permet de fusionner les deux maillages et de reclasser les aires créées toujours par ordre croissant.
Je dois ajouter une dernière fonction sur laquelle je bloque: la détermination des points du maillage qui forme le contour extérieur du maillage. Ceux-ci sont caractérisés par le fait que les segments qui les relient n'appartiennent qu'à une seule maille.

Voici mon fichier permettant d'éxécuter les sous-programmes:
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
clear all
close all
clear classes
M1=maillage(7);
M2=maillage(7);
M1c=M1.classer;
M2c=M2.classer;
M1.afficher
M2.afficher
M1c.afficher
M2c.afficher
M3=M1.fusion(M2);
M3c=M3.classer;
M3.afficher
M3c.afficher
Voici mes sous-programmes:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
classdef maillage;
    properties (SetAccess=public)
        CrdNd;
        Connex;
        nbNd;
        nbElt;
        Aires;
        segment;
    end

    methods;
        function obj=maillage (n)
            obj.CrdNd=rand (n,2);
            obj.Connex=delaunay (obj.CrdNd(:,1),obj.CrdNd(:,2));
            obj.nbNd=size (obj.CrdNd,1);
            obj.nbElt=size (obj.Connex,1);
            for e=1:obj.nbElt
                N1=obj.Connex(e,1);
                N2=obj.Connex(e,2);
                N3=obj.Connex(e,3);
                X1=obj.CrdNd(N1,1);
                Y1=obj.CrdNd(N1,2);
                X2=obj.CrdNd(N2,1);
                Y2=obj.CrdNd(N2,2);
                X3=obj.CrdNd(N3,1);
                Y3=obj.CrdNd(N3,2);
                obj.Aires(e)=1/2*abs ((X2-X1)*(Y3-Y1)-(X3-X1)*(Y2-Y1));
            end
        end

        function obj=classer (obj)
            list_aires=obj.Aires;
            ordre=[1:obj.nbElt]';
            for j=obj.nbElt:-1:2;
                for i=1:j-1;
                    if list_aires (i)>list_aires (i+1);
                        k=list_aires (i+1);
                        list_aires (i+1)=list_aires (i);
                        list_aires (i)=k;
                        k=ordre (i+1);
                        ordre (i+1)=ordre (i);
                        ordre (i)=k;
                    end
                end
            end
            obj.Aires=list_aires;
            obj.Connex=obj.Connex(ordre,: );
        end

        function obj3=fusion (obj1,obj2)
            obj3.CrdNd=[obj1.CrdNd;obj2.CrdNd];
            obj3=maillage (obj1.nbNd+obj2.nbNd);
            obj3.Aires=[];
            obj3.Connex=delaunay (obj3.CrdNd(:,1),obj3.CrdNd(:,2));
            obj3.nbNd=size (obj3.CrdNd,1);
            obj3.nbElt=size (obj3.Connex,1);
            for e=1:obj3.nbElt;
                N1=obj3.Connex(e,1);
                N2=obj3.Connex(e,2);
                N3=obj3.Connex(e,3);
                X1=obj3.CrdNd(N1,1);
                Y1=obj3.CrdNd(N1,2);
                X2=obj3.CrdNd(N2,1);
                Y2=obj3.CrdNd(N2,2);
                X3=obj3.CrdNd(N3,1);
                Y3=obj3.CrdNd(N3,2);
                obj3.Aires(e)=(1/2)*abs ((X2-X1)*(Y3-Y1)-(X3-X1)*(Y2-Y1));
            end
        end

        function obj=afficher (obj)
            figure
            trimesh (obj.Connex,obj.CrdNd(:,1),obj.CrdNd(:,2))
            for e=1:obj.nbElt;
                N1=obj.Connex(e,1);
                N2=obj.Connex(e,2);
                N3=obj.Connex(e,3);
                X1=obj.CrdNd(N1,1);
                Y1=obj.CrdNd(N1,2);
                X2=obj.CrdNd(N2,1);
                Y2=obj.CrdNd(N2,2);
                X3=obj.CrdNd(N3,1);
                Y3=obj.CrdNd(N3,2);
                B=[(X1+X2+X3)/3,(Y1+Y2+Y3)/3];
                text (B (1,1),B (1,2),num2str (e));
            end
        end

        function obj=noeuds_frontiere (obj)
            for e=1:obj.nbElt;
                N1=obj.Connex(e,1);
                N2=obj.Connex(e,2);
                N3=obj.Connex(e,3);
            end
        end
    end
end
La fonction en rouge est celle que je n'arrive pas à terminer...
Merci d'avance pour votre temps !