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!

weisseln(p,e,t)
function weisseln(p,e,t)
% GEKELER: FINITE ELEMENTE
% Flaeche ausserhalb von Rand (durch ''e'' definiert)
% wird geweisselt; DELAUNAY-Triangulierung
% Voraussetzung: EINE Dreiecksseite schneidet EINE Randstrecke
% uebrige Faelle unberuecksichtigt
% Rand muss geordnet werden, damit
% INPLOYGON richtig arbeitet
% -- Parameter -------------------------
N     = 5;  % weitere Punkte
DIST  = 0.5; % Distanz zum Rand in x-,y-Richtung
TOL   = 1.0E-6;
% -- HILFSPUNKTE --------------------------
X = p(1,:); Y = p(2,:);
XLIN  = linspace(min(X)-DIST,max(X)+DIST,N);
YLIN  = linspace(min(Y)-DIST,max(Y)+DIST,N);
KN    = [];
for I = 1:N
   KN = [KN, [XLIN; YLIN(I)*ones(1,N)]];
end
% -- RAND ORDNEN FUER INPOLYGON ------------
E     = [e(1,1);e(2,1)];
for I = 1:size(e,2)
   J  = find(e(1,:) == E(2,I));
   E  = [E, e(1:2,J)];
end
RAND  = p(:,E(1,:));
% -- NEUE KNOTEN  ---------------------------
KN    = [KN, RAND];
X     =  [KN(1,:), RAND(1,:)];
Y     =  [KN(2,:), RAND(2,:)];
% -- TRIANGULIERUNG; ORDNEN! ----------------
TRI   = delaunay(X,Y);
for I = 1:size(TRI,1);
   AUX = TRI(I,:);
   X21 = X(AUX(2)) - X(AUX(1));
   X31 = X(AUX(3)) - X(AUX(1));
   Y21 = Y(AUX(2)) - Y(AUX(1));
   Y31 = Y(AUX(3)) - Y(AUX(1));
   DET = X21*Y31 - X31*Y21;
   if DET <= 0
      AUX1 = TRI(I,1);
      TRI(I,1) = TRI(I,2);
      TRI(I,2) = AUX1;
   end
end
% -- SUCHEN UND ERSETZEN 1 -------------
M = size(TRI,1); AUX = zeros(1,M);
for I = 1:M
   AUX1 = inpolygon(X(TRI(I,:)),Y(TRI(I,:)),RAND(1,:),RAND(2,:));
   J   = ismember([0,0.5,1],AUX1);
   if sum(J) == 3, AUX(I) = 1; end
end
J = find(AUX == 1); L = length(J);
if L
   % --------------------------------------------
   for I = 2:L
      for K = 1:I-1
         if sum(ismember(TRI(J(I),:),TRI(J(K),:))) == 2
            [TRI1_N,TRI2_N] = change(TRI(J(I),:),TRI(J(K),:));
            TRI(J(I),:) = TRI1_N;
            TRI(J(K),:) = TRI2_N;
         end
      end
   end
end
% -- SUCHEN UND ERSETZEN 2 ------------------
AUX  = zeros(1,M);
for I = 1:M
   AUX1 = inpolygon(X(TRI(I,:)),Y(TRI(I,:)),RAND(1,:),RAND(2,:));
   if sum(AUX1) == 1 & ismember(0,AUX1)
      AUX(I) = 1;
   end
end
J = find(AUX == 1); L = length(J);
if L
   for I = 2:L
      for K = 1:I-1
         if sum(ismember(TRI(J(I),:),TRI(J(K),:))) == 2
            [C,D] = change(TRI(J(I),:),TRI(J(K),:));
            X21  = X(C(2)) - X(C(1));
            X31  = X(C(3)) - X(C(1));
            Y21  = Y(C(2)) - Y(C(1));
            Y31  = Y(C(3)) - Y(C(1));
            DET1 = X21*Y31 - X31*Y21;
            X21  = X(D(2)) - X(D(1));
            X31  = X(D(3)) - X(D(1));
            Y21  = Y(D(2)) - Y(D(1));
            Y31  = Y(D(3)) - Y(D(1));
            DET2 = X21*Y31 - X31*Y21;
            DONE1 = DET1 > TOL & DET2 > TOL;
            XNC = sum(X(C))/3;
            YNC = sum(Y(C))/3;
            XND = sum(X(D))/3;
            YND = sum(Y(D))/3;
            AUX3 = inpolygon(XNC,YNC,RAND(1,:),RAND(2,:));
            AUX4 = inpolygon(XND,YND,RAND(1,:),RAND(2,:));
            DONE2 = (AUX3==1&AUX4==0)|(AUX3==0&AUX4==1);
            if DONE1 & DONE2
               TRI(J(I),:) = C;
               TRI(J(K),:) = D;
            end
         end
      end
   end
end
% -- AUSSERE DREIECKE BERECHNEN ------------------
M  = size(TRI,1); ZN = zeros(2,M);
for I = 1:M
   ZN(1,I) = sum(X(TRI(I,:)))/3;
   ZN(2,I) = sum(Y(TRI(I,:)))/3;
end
AUX  = inpolygon(ZN(1,:),ZN(2,:),RAND(1,:),RAND(2,:));
J    = find(AUX == 0);
TRI1 = TRI(J,:);
% -- BILD 4 --------------------------------------
%trimesh(TRI,X,Y,'color','k'), hold on
Z = 0.1*ones(1,length(X));
trisurf(TRI1,X,Y,Z,'edgecolor','w','facecolor','w'), hold on
Z = 0.1*ones(1,size(RAND,2));
plot3(RAND(1,:),RAND(2,:),Z,'r'), hold on
%grid on
%axis equal

function [TRI1_N,TRI2_N] = change(TRI1,TRI2)
% GEKELER: FINITE ELEMENTE -----------------
% Hilfsfile fuer WEISSELN.M
TRI1_N = TRI1; TRI2_N = TRI2;
A = zeros(3,1); B = zeros(3,1);
AUX1 = [TRI1, TRI1([1:2])];
AUX2 = [TRI2, TRI2([1:2])];
A(1) = sum(ismember(AUX1(1:2),AUX2));
A(2) = sum(ismember(AUX1(2:3),AUX2));
A(3) = sum(ismember(AUX1(3:4),AUX2));
B(1) = sum(ismember(AUX2(1:2),AUX1));
B(2) = sum(ismember(AUX2(2:3),AUX1));
B(3) = sum(ismember(AUX2(3:4),AUX1));
I1   = find(A == 2);
I2   = find(B == 2);
if ~isempty(I1) & ~isempty(I2)
   TRI1_N = [AUX1(I1),AUX2(I2+2),AUX1(I1+2)];
   TRI2_N = [AUX2(I2),AUX1(I1+2),AUX2(I2+2)];
end




Contact us at files@mathworks.com