[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 |
|
---|
| 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
|
---|