quit earlier after mutating a bend
This commit is contained in:
parent
7502471808
commit
88f6b66f26
15
IV/wm.sql
15
IV/wm.sql
@ -254,17 +254,18 @@ declare
|
|||||||
begin
|
begin
|
||||||
mutated = false;
|
mutated = false;
|
||||||
|
|
||||||
-- go through the bends and find one where sum of inflection angle is >180
|
<<bendloop>>
|
||||||
for i in 1..array_length(bends, 1) loop
|
for i in 1..array_length(bends, 1) loop
|
||||||
continue when abs(inflection_angle(bends[i])) <= pi;
|
continue when abs(inflection_angle(bends[i])) <= pi;
|
||||||
-- sum of inflection angles for this bend is >180, so it may be
|
-- sum of inflection angles for this bend is >180, so it may be
|
||||||
-- self-crossing. now try to find another bend in this line that
|
-- self-crossing. now try to find another bend in this line that
|
||||||
-- crosses an imaginary line of end-vertices
|
-- crosses an imaginary line of end-vertices
|
||||||
|
|
||||||
-- go through each bend in the given line, and see if has a potential to
|
-- Go through each bend in the given line, and see if has a potential to
|
||||||
-- cross bends[i].
|
-- cross bends[i]. The line-cut process is different when i<j and i>j;
|
||||||
|
-- therefore there are two loops, one for each case.
|
||||||
for j in 1..i-1 loop
|
for j in 1..i-1 loop
|
||||||
select if_selfcross(bends[i], bends[j]) into multi;
|
multi = if_selfcross(bends[i], bends[j]);
|
||||||
continue when multi is null;
|
continue when multi is null;
|
||||||
mutated = true;
|
mutated = true;
|
||||||
|
|
||||||
@ -278,11 +279,11 @@ begin
|
|||||||
st_pointn(bends[i], st_npoints(bends[i]))
|
st_pointn(bends[i], st_npoints(bends[i]))
|
||||||
);
|
);
|
||||||
bends = bends[1:j] || bends[i+1:];
|
bends = bends[1:j] || bends[i+1:];
|
||||||
exit;
|
continue bendloop;
|
||||||
end loop;
|
end loop;
|
||||||
|
|
||||||
for j in reverse array_length(bends, 1)..i+1 loop
|
for j in reverse array_length(bends, 1)..i+1 loop
|
||||||
select if_selfcross(bends[i], bends[j]) into multi;
|
multi = if_selfcross(bends[i], bends[j]);
|
||||||
continue when multi is null;
|
continue when multi is null;
|
||||||
mutated = true;
|
mutated = true;
|
||||||
|
|
||||||
@ -294,7 +295,7 @@ begin
|
|||||||
st_removepoint(st_geometryn(multi, st_numgeometries(multi)), 0)
|
st_removepoint(st_geometryn(multi, st_numgeometries(multi)), 0)
|
||||||
);
|
);
|
||||||
bends = bends[1:i] || bends[j+1:];
|
bends = bends[1:i] || bends[j+1:];
|
||||||
exit;
|
continue bendloop;
|
||||||
end loop;
|
end loop;
|
||||||
end loop;
|
end loop;
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user