gentle inflection of a bend
This commit is contained in:
parent
4c6adcc71e
commit
198ea6d0e3
@ -16,11 +16,13 @@ create table figures (name text, way geometry);
|
|||||||
insert into figures (name, way) values ('fig3',ST_GeomFromText('LINESTRING(0 0,12 0,13 4,20 2,20 0,32 0,33 10,38 16,43 15,44 10,44 0,60 0)'));
|
insert into figures (name, way) values ('fig3',ST_GeomFromText('LINESTRING(0 0,12 0,13 4,20 2,20 0,32 0,33 10,38 16,43 15,44 10,44 0,60 0)'));
|
||||||
insert into figures (name, way) values ('fig3-1',ST_GeomFromText('LINESTRING(0 0,12 0,13 4,20 2,20 0,32 0,33 10,38 16,43 15,44 10,44 0)'));
|
insert into figures (name, way) values ('fig3-1',ST_GeomFromText('LINESTRING(0 0,12 0,13 4,20 2,20 0,32 0,33 10,38 16,43 15,44 10,44 0)'));
|
||||||
insert into figures (name, way) values ('fig5',ST_GeomFromText('LINESTRING(0 39,19 52,27 77,26 104,41 115,49 115,65 103,65 75,53 45,63 15,91 0,91 0)'));
|
insert into figures (name, way) values ('fig5',ST_GeomFromText('LINESTRING(0 39,19 52,27 77,26 104,41 115,49 115,65 103,65 75,53 45,63 15,91 0,91 0)'));
|
||||||
|
insert into figures (name, way) values ('inflection-1',ST_GeomFromText('LINESTRING(129 45,131 56,130 82,128 99,147 104,149 89,147 68,141 52)'));
|
||||||
|
|
||||||
drop table if exists bends;
|
drop table if exists bends;
|
||||||
create table bends (way geometry);
|
create table bends (way geometry);
|
||||||
insert into bends select unnest(detect_bends((select way from figures where name='fig3')));
|
insert into bends select unnest(detect_bends((select way from figures where name='fig3')));
|
||||||
insert into bends select unnest(detect_bends((select way from figures where name='fig5')));
|
insert into bends select unnest(detect_bends((select way from figures where name='fig5')));
|
||||||
|
insert into bends select unnest(detect_bends((select way from figures where name='inflection-1')));
|
||||||
|
|
||||||
do $$
|
do $$
|
||||||
declare
|
declare
|
||||||
|
52
wm.sql
52
wm.sql
@ -70,7 +70,59 @@ $$ language plpgsql;
|
|||||||
|
|
||||||
-- fix_gentle_inflections moves bend endpoints following "Gentle Inflection at
|
-- fix_gentle_inflections moves bend endpoints following "Gentle Inflection at
|
||||||
-- End of a Bend" section.
|
-- End of a Bend" section.
|
||||||
|
--
|
||||||
|
-- The text does not specify how many vertices can be "adjusted"; it can
|
||||||
|
-- equally be one or many. This function is adjusting many, as long as the
|
||||||
|
-- commulative inflection angle is less than pi/6 (30 deg).
|
||||||
create or replace function fix_gentle_inflections(INOUT bends geometry[]) as $$
|
create or replace function fix_gentle_inflections(INOUT bends geometry[]) as $$
|
||||||
|
declare
|
||||||
|
prev_bend geometry;
|
||||||
|
bend geometry;
|
||||||
|
p geometry;
|
||||||
|
p1 geometry;
|
||||||
|
p2 geometry;
|
||||||
|
p3 geometry;
|
||||||
begin
|
begin
|
||||||
|
foreach bend in array bends loop
|
||||||
|
if prev_bend is null then
|
||||||
|
prev_bend = bend;
|
||||||
|
continue;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- Predicate: two bends will always share an edge. Assuming (A,B,C,D,E,F)
|
||||||
|
-- is a bend:
|
||||||
|
-- C________D
|
||||||
|
-- / \
|
||||||
|
-- \________/ \_______/
|
||||||
|
-- A B E F
|
||||||
|
--
|
||||||
|
-- Then edges (A,B) and (E,F) are shared with the neighboring bends.
|
||||||
|
--
|
||||||
|
--
|
||||||
|
-- Assume this curve:
|
||||||
|
--
|
||||||
|
-- A______B
|
||||||
|
-- ---' `---.___. E
|
||||||
|
-- C D |
|
||||||
|
-- _I |
|
||||||
|
-- '---.________ |
|
||||||
|
-- H G'---+ F
|
||||||
|
--
|
||||||
|
-- After processing the curve following the definition of a bend, the bend
|
||||||
|
-- [A-G] would be detected. Assuming inflection point G and H are "small",
|
||||||
|
-- the bend would be extended by two edges to [A,I].
|
||||||
|
for p in (select geom from st_dumppoints(prev_bend) order by path[1] desc) loop
|
||||||
|
p3 = p2;
|
||||||
|
p2 = p1;
|
||||||
|
p1 = p;
|
||||||
|
if p3 is null then
|
||||||
|
continue;
|
||||||
|
end if;
|
||||||
|
|
||||||
|
-- (p2, p1) is shared with the current bend.
|
||||||
|
end loop;
|
||||||
|
|
||||||
|
prev_bend = bend;
|
||||||
|
end loop;
|
||||||
end
|
end
|
||||||
$$ language plpgsql;
|
$$ language plpgsql;
|
||||||
|
Loading…
Reference in New Issue
Block a user