From: treecity Date: Sun, 10 Apr 2011 14:13:54 +0000 (+0000) Subject: [src] Umgestiegen auf Matlab (vorläufig) X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=f73cf25fea2bd8582e2d6d818b93cbfa2e547760;p=bacc.git [src] Umgestiegen auf Matlab (vorläufig) [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 --- diff --git a/src/Aelements.m b/src/Aelements.m new file mode 100644 index 0000000..2526bdf --- /dev/null +++ b/src/Aelements.m @@ -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 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 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 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 index 0000000..d7c9a9a --- /dev/null +++ b/src/plotShape.m @@ -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 index 0000000..8fd0c78 --- /dev/null +++ b/src/quad_norm.m @@ -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 index 0000000..3c199fc --- /dev/null +++ b/src/refineQuad.m @@ -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 index 0000000..0446fa0 --- /dev/null +++ b/src/test_refine.m @@ -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