]> git.leopard-lacewing.eu Git - bacc.git/commitdiff
[src] Umgestiegen auf Matlab (vorläufig)
authortreecity <treecity@26120e32-c555-405d-b3e1-1f783fb42516>
Sun, 10 Apr 2011 14:13:54 +0000 (14:13 +0000)
committertreecity <treecity@26120e32-c555-405d-b3e1-1f783fb42516>
Sun, 10 Apr 2011 14:13:54 +0000 (14:13 +0000)
[src] primitive Netzverwaltung für Rechtecke entworfen
[src] refine, plot, norm und space Funktionieren auf dem Gitter...

git-svn-id: https://drops.fb12.tu-berlin.de/svn/bacc/trunk@5 26120e32-c555-405d-b3e1-1f783fb42516

src/Aelements.m [new file with mode: 0644]
src/exmpl_2DLShape.mat [new file with mode: 0644]
src/exmpl_2DQuad.mat [new file with mode: 0644]
src/exmpl_3DCube.mat [new file with mode: 0644]
src/plotShape.m [new file with mode: 0644]
src/quad_norm.m [new file with mode: 0644]
src/refineQuad.m [new file with mode: 0644]
src/test_refine.m [new file with mode: 0644]

diff --git a/src/Aelements.m b/src/Aelements.m
new file mode 100644 (file)
index 0000000..2526bdf
--- /dev/null
@@ -0,0 +1,19 @@
+function A = Aelements(coordinates, elements)
+% This function calculates the Sum of all Surfaces
+%
+% A=Aelements(coordinates,elements)
+%
+% P.Schaefer
+
+elles = size(elements,1);
+A=0;
+for i = 1:elles
+    tri = elements(i,:);
+    a = (coordinates(tri(1),:)-coordinates(tri(2),:));
+    b = (coordinates(tri(1),:)-coordinates(tri(3),:));
+    A1 = norm(cross(a',b'));
+    A = A+ A1;
+end
+
+end
+
diff --git a/src/exmpl_2DLShape.mat b/src/exmpl_2DLShape.mat
new file mode 100644 (file)
index 0000000..cf8287e
Binary files /dev/null and b/src/exmpl_2DLShape.mat differ
diff --git a/src/exmpl_2DQuad.mat b/src/exmpl_2DQuad.mat
new file mode 100644 (file)
index 0000000..eec4281
Binary files /dev/null and b/src/exmpl_2DQuad.mat differ
diff --git a/src/exmpl_3DCube.mat b/src/exmpl_3DCube.mat
new file mode 100644 (file)
index 0000000..a00867a
Binary files /dev/null and b/src/exmpl_3DCube.mat differ
diff --git a/src/plotShape.m b/src/plotShape.m
new file mode 100644 (file)
index 0000000..d7c9a9a
--- /dev/null
@@ -0,0 +1,75 @@
+function plotShape(coordinates, elements, varargin)
+%
+% plotShape(coordinates,elements)
+% plotShape(coordinates,elements,'FLAG')
+%
+% Diese Funktion Zeichnet alle Vierecke mit ausgef llten F l c h e n , wenn als
+% dritter Parameter noch 'f' angegeben wird. Werden nur die Kanten
+% gezeichnet. Wenn 'c' angegeben wird werden auch die Ecken als kleine rote
+% Kreise dargestellt
+% Flag: 'c', 'b' oder 'cb' bzw. 'bc'
+%
+% P.Schaefer
+
+%% Parameterueberpruefung
+c = 0;
+e = 1;
+n = 0;
+optargin = size(varargin,2);
+if(optargin>1)
+    error('Zu viele Argumente');
+elseif(optargin==1)
+    if(ismember('b',varargin{1}))
+        e = 0;
+    end
+    if(ismember('c',varargin{1}))
+        c = 1;
+    end
+    if(ismember('n',varargin{1}))
+        n = 1;
+    end
+end
+
+%% Koordinaten einzeichnen
+if(c)
+    scatter3(coordinates(:,1),coordinates(:,2),coordinates(:,3),'r');
+    hold on
+end
+
+%% Dreiecke einzeichnen
+eles = size(elements,1);
+if(e)
+    for idx = 1:eles
+        current = coordinates(elements(idx,[1:3,3,1])',:);
+        current(3,:) = current(3,:)-current(1,:)+current(2,:);
+        fill3(current(:,1),current(:,2),current(:,3),'b'); % Zeichnet Oberflaeche
+        hold on
+    end
+else
+    for idx = 1:eles
+        current = coordinates(elements(idx,[1:3,3,1])',:);
+        current(3,:) = current(3,:)-current(1,:)+current(2,:);
+        plot3(current(:,1),current(:,2),current(:,3),'b'); % Zeichnet nur Kanten
+        hold on
+    end
+end
+
+if(n)
+    anorm = quad_norm(coordinates,elements);
+    for idx = 1:eles
+        current = sum(coordinates(elements(idx,[2,3])',:),1)/2;
+        current = [current ; current+anorm(idx,:)];
+        plot3(current(:,1),current(:,2),current(:,3),'r'); % Zeichnet Oberflaeche
+        scatter3(current(2,1),current(2,2),current(2,3),'xr');
+        hold on
+    end
+end
+
+xlabel 'x'
+ylabel 'y'
+zlabel 'z'
+
+hold off
+
+end
+
diff --git a/src/quad_norm.m b/src/quad_norm.m
new file mode 100644 (file)
index 0000000..8fd0c78
--- /dev/null
@@ -0,0 +1,43 @@
+function n = quad_norm(coordinates, elements,varargin)
+%
+% norm = tri_norm(coordinates, elements)
+% norm = tri_norm(coordinates, elements, 'FLAG')
+%
+% This function builds the norm for every triangle
+%
+% P.Schaefer
+
+%% Parameterueberpruefung
+w = 1;
+
+optargin = size(varargin,2);
+if(optargin>1)
+    error('Zu viele Argumente');
+elseif(optargin==1)
+    if(ismember('w',varargin{1}))
+        w = 0;
+    end
+end
+
+    %Numbers needed
+    s_ele = size(elements,1);
+    
+
+%%  calculate the Norm
+    n = zeros(size(elements));
+    for i = 1:s_ele
+        % normalized Vector on every triangle
+        tri = elements(i,:);
+        a = (coordinates(tri(2),:)-coordinates(tri(1),:));
+        b = (coordinates(tri(3),:)-coordinates(tri(1),:));
+        N = cross(a',b');
+        if(w)
+            N = N/norm(N);
+        end
+        n(i,:) = N;
+    end
+
+end
+
+
+
diff --git a/src/refineQuad.m b/src/refineQuad.m
new file mode 100644 (file)
index 0000000..3c199fc
--- /dev/null
@@ -0,0 +1,51 @@
+function [coordinates,elements] = refineQuad(coordinates,elements,type)
+
+c_loop = size(elements,1);
+
+for i = 1:c_loop
+    c_ele = size(elements,1);
+    c_coo = size(coordinates,1);
+    
+    
+    el = elements(i,:);
+    if(type(i)==0)
+        continue;
+    elseif(type(i)==1)
+        newc = (coordinates(el(3),:)+coordinates(el(1),:))/2;
+        coordinates(c_coo+1,:) = newc;
+        elements(i,3) = c_coo+1;
+        
+        newc = newc+(coordinates(el(2),:)-coordinates(el(1),:));
+        coordinates(c_coo+2,:) = newc;
+        
+        elements(c_ele+1,:) = [c_coo+1,c_coo+2,el(3)];
+    elseif(type(i)==2)
+        newc = (coordinates(el(3),:)+coordinates(el(1),:))/2;
+        coordinates(c_coo+1,:) = newc;
+        elements(i,3) = c_coo+1;
+        
+        newc = newc+(coordinates(el(2),:)-coordinates(el(1),:));
+        coordinates(c_coo+2,:) = newc;
+        
+        elements(c_ele+1,:) = [c_coo+1,c_coo+2,el(3)];       
+    elseif(type(i)==3)
+        newc1 = (coordinates(el(2),:)+coordinates(el(1),:))/2;
+        newc2 = (coordinates(el(3),:)+coordinates(el(1),:))/2;
+        coordinates(c_coo+1,:) = newc1;
+        coordinates(c_coo+2,:) = newc2;
+        elements(i,:) = [el(1),c_coo+1,c_coo+2];
+        
+        newc3 = (coordinates(el(2),:)+coordinates(el(3),:))/2;
+        coordinates(c_coo+3,:) = newc3;
+        elements(c_ele+1,:) = [c_coo+1,el(2),c_coo+3];
+        elements(c_ele+2,:) = [c_coo+2,c_coo+3,el(3)];
+        
+        newc4 = newc2+(coordinates(el(2),:)-coordinates(el(1),:));
+        newc5 = newc1+(coordinates(el(3),:)-coordinates(el(1),:));
+        coordinates(c_coo+4,:) = newc4;
+        coordinates(c_coo+5,:) = newc5;
+        elements(c_ele+3,:) = [c_coo+3,c_coo+4,c_coo+5];
+    end
+end
+end
+
diff --git a/src/test_refine.m b/src/test_refine.m
new file mode 100644 (file)
index 0000000..0446fa0
--- /dev/null
@@ -0,0 +1,24 @@
+
+    eles = size(elements,1);
+
+    if not(exist('r_times'))
+        r_times = 1;
+    end
+    
+    if not(exist('r_type'))
+        r_type = 4;
+    end
+    if(r_type > 3)
+        marked = round(3*rand(1,eles));
+    elseif(r_type < 0)
+        return;
+    else
+        marked = ones(1,eles)*r_type;
+    end
+    
+   for i = 1:r_times 
+    [coordinates,elements]=refineQuad(coordinates,elements,marked);
+   end
+   
+   clear i eles
\ No newline at end of file