No BSD License  

Highlights from
Several kinds of Mathematical examples!

from Several kinds of Mathematical examples! by Giovani Tonel
Here there are several kinds of Mathematical problems!

mesh11(p,e,segnr1,segnr2,GRAFIK)
function [ELEMENTE,FORMED] = mesh11(p,e,segnr1,segnr2,GRAFIK)
% Eckart Gekeler, Universitaet Stuttgart, Release 8.4.05
% Triangulierung eines Gebietes mit Aussenrand
% und ev. einem Innenrand
% ohne innere Punkte (geht auch mit delauny)
% Vgl. Int.J.Numer.Meth.Eng. 37 (1994), pp. 1779-1789

%GRAFIK = 0; % GRAFIK = 1/0 :Zeichnung
M = 0;
for I = 1:length(segnr1)
   M = M + length(find(e(5,:) == segnr1(I)));
end
N = 0;
for I = 1:length(segnr2)
   N = N + length(find(e(5,:) == segnr2(I)));
end
J         = [1:M-1]';
TO_BE     = [J, J+1; M  1];
if N > 0
   J      = [M+1:M+N-1]';
   TO_BE  = [TO_BE; J, J+1; M+N, M+1];
end
BOUND     = TO_BE;
N2        = size(BOUND,1);
NEVER     = [TO_BE(:,2), TO_BE(:,1)];
FORMED    = [];
ELEMENTE  = [];
ISTEP     = 0;
while size(TO_BE,1) > 0
   ISTEP  = ISTEP + 1;
   K      = TO_BE(1,1);
   L      = TO_BE(1,2);
   A      = p(:,K);
   B      = p(:,L);
   LEFT_LIST = zeros(N,2);
   for J = 1:M+N
      C   = p(:,J);
      AB1 = B(1) - A(1);
      AB2 = B(2) - A(2);
      AC1 = C(1) - A(1);
      AC2 = C(2) - A(2);
      BC1 = C(1) - B(1);
      BC2 = C(2) - B(2);
      DET = AB1*AC2 - AC1*AB2;
      LEFT_LIST(J,2)...
          = sqrt(AC1^2 + AC2^2) + sqrt(BC1^2 + BC2^2);
      if DET > 0
         LEFT_LIST(J,1) = J;
      end
   end
   I         = find(LEFT_LIST(:,1) ~= 0);
   LEFT_LIST = LEFT_LIST(I,:);
   [Y,J]     = sort(LEFT_LIST(:,2));
   LEFT_LIST = LEFT_LIST(J,:);
   % -- Abarbeiten von LEFT_LIST ----------------------
   LLNR   = 1;
   done   = 0;
   if size(LEFT_LIST,1) == 0
      done = 2;
   end
   while ~done
      J   = LEFT_LIST(LLNR,1);
      C   = p(:,J);
      L1  = length(find(NEVER(:,1) == L & NEVER(:,2) == J));
      L2  = length(find(NEVER(:,1) == J & NEVER(:,2) == K));
      L3  = 0;
      L4  = 0;
      if size(FORMED,1) > 0
         L3 = length(find(FORMED(:,1) == L &...
                          FORMED(:,2) == J));
         L4 = length(find(FORMED(:,1) == J &...
                          FORMED(:,2) == K));
      end
      INLIST = L1 + L2 + L3 + L4;
      if INLIST == 0
         FLAG     = zeros(4,1);
         SCHNITT  = 0;
         for I = 1:N2
            I1    = BOUND(I,1);
            I2    = BOUND(I,2);
            D     = p(:,I1);
            E     = p(:,I2);
            FLAG(1) = schnitt(B,C,D,E);
            FLAG(2) = schnitt(C,A,D,E);
         end
         for I = 1:size(FORMED,1)
            I1    = FORMED(I,1);
            I2    = FORMED(I,2);
            D     = p(:,I1);
            E     = p(:,I2);
            FLAG(3) = schnitt(B,C,D,E);
            FLAG(4) = schnitt(C,A,D,E);
            if any(FLAG) == 1
               SCHNITT = 1;
            end
         end
         if SCHNITT == 0
            done = 1;
         end
      end
      if LLNR < size(LEFT_LIST,1);
         LLNR = LLNR + 1;
      else
         done = 2;
      end
   end
   % ----------------------------------------------------
   if done == 2
      M1    = size(TO_BE,1);
      TO_BE = TO_BE(2:M1,:);
   end
   % ----------------------------------------------------
   if done == 1
      ELEMENTE = [ELEMENTE, [K L J]'];
      % ------------------------------------------
      if GRAFIK == 1;
         %set(0,'DefaultLineColor','k');
         X1  = p(1,:); Y1  = p(2,:);
         plot(X1,Y1,'.','MarkerSize',12), hold on
         tri = ELEMENTE(1:3,:)';
         Z3  = zeros(length(X1),1);
         trimesh(tri,X1,Y1,Z3,'edgecolor','b');
         pause(0.5)
      end
      % UPDATEN VON FORMED -------------------------------
      FORMED = [FORMED; K, L; L, J; J, K];
      % UPDATEN VON TO_BE --------------------------------
      VERT   = [K, L, J, K];
      for K1 = 1:3
         N1    = size(TO_BE,1);
         AUX   = zeros(N1,1);
         for I = 1:N1
            if TO_BE(I,1) == VERT(K1) & TO_BE(I,2) == VERT(K1+1)
               AUX(I) = 1;
            end
         end
         P     = find(AUX == 0);
         Q     = find(AUX == 1);
         TO_BE = TO_BE(P,:);
         AUX   = zeros(N2,1);
         for I = 1:N2
            if BOUND(I,1) == VERT(K1) & BOUND(I,2) == VERT(K1+1)
               AUX(I) = 1;
            end
         end
         R     = find(AUX == 1);
         if length(Q) == 0  & length(R) == 0
            TO_BE = [TO_BE; VERT(K1+1), VERT(K1)];
         end
      end
   end
end
% Es treten keine doppelten Elemente auf!


Contact us at files@mathworks.com