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