1 | function new_flags=PropagateFlagsUntilDistance(md,flags,distance)
|
---|
2 | %PROPAGATEFLAGSUNTILDISTANCE
|
---|
3 | %
|
---|
4 | % Usage:
|
---|
5 | % flags=PropagateFlagsUntilDistance(md,flags,distance)
|
---|
6 | %
|
---|
7 | %
|
---|
8 |
|
---|
9 |
|
---|
10 |
|
---|
11 | new_flags=flags;
|
---|
12 |
|
---|
13 | %find elements that are at the border of flags:
|
---|
14 | flag_elements=find(flags);
|
---|
15 | conn=md.elementconnectivity(flag_elements,:);
|
---|
16 | pos=find(conn);conn(pos)=~flags(conn(pos));
|
---|
17 | sum_conn=sum(conn,2);
|
---|
18 | border_elements=flag_elements(find(sum_conn>=1));
|
---|
19 |
|
---|
20 |
|
---|
21 | %average x and y over elements:
|
---|
22 | x_elem=md.x(md.elements)*[1;1;1]/3;
|
---|
23 | y_elem=md.y(md.elements)*[1;1;1]/3;
|
---|
24 |
|
---|
25 | while 1,
|
---|
26 |
|
---|
27 | %keep copy of new_flags for this loop:
|
---|
28 | new_flags_bak=new_flags;
|
---|
29 |
|
---|
30 | %extend new flags by connectivity
|
---|
31 | pos=find(new_flags);
|
---|
32 |
|
---|
33 | connected_elements=md.elementconnectivity(pos,:);
|
---|
34 | connected_elements=connected_elements(find(connected_elements));
|
---|
35 | new_flags(connected_elements)=1;
|
---|
36 |
|
---|
37 | %get new elements:
|
---|
38 | new_elements=find(new_flags & ~new_flags_bak);
|
---|
39 | if ~length(new_elements),
|
---|
40 | %we are done!
|
---|
41 | break;
|
---|
42 | end
|
---|
43 |
|
---|
44 |
|
---|
45 | %check which of these new elements are more than distance away from the border elements
|
---|
46 | for i=1:length(new_elements),
|
---|
47 | dist=sqrt( (x_elem(border_elements)-x_elem(new_elements(i))).^2 + (y_elem(border_elements)-y_elem(new_elements(i))).^2)-distance;
|
---|
48 | if ~any(dist<0)
|
---|
49 | %none of the border elements are within distance, this element is outside out area of interest.
|
---|
50 | %ensure this element never gets found again in the connectivity.
|
---|
51 | pos=find(md.elementconnectivity==new_elements(i));
|
---|
52 | md.elementconnectivity(pos)=0;
|
---|
53 | %exclude this new element from the new_flags!
|
---|
54 | new_flags(new_elements(i))=0;
|
---|
55 | end
|
---|
56 | end
|
---|
57 | end
|
---|