Mapování malých jeskyní v programu therion

Aktualni informace naleznete na:
http://therion.speleo.sk/wiki/doku.php?id=czsk:mmj

 

Něco málo na úvod

Po školení therion na Slovensku v Nízkých Tatrách na chatě Kosodřevina jsem se začal aktivně zajímat o tvorbu mapové dokumentace v tomto programu.

Program THERION byl vytvořen původně pro mapování jeskyně Mrtvých Netopírů, tato jeskyně dosahuje celkové délky 25 Km, vzhledem k těmto „proporcím“ je při vkládání některých značek (bodů), polí (sand, debris, rock),atd. pro malé jeskyně problém z hustotou, rozložením těchto značek.

Hustotou rozumíme vzdálenost jednotlivých čar, bodu, značek.. od sebe. Jednoduše řečeno pokud mám dóm o velikosti 40*40 metrů a vyplníte ho celý typem debris (štěrk) bude v této velikosti snadno čitelné na mapě o jakou výplň se jedná, pokud ovšem použijeme stejnou výplň na dóm 4*4 metry bude rozložení značek stejně daleko od sebe jako v předchozím příkladě a tudíž na výsledné mapě bude hůře čitelné (jelikož je dóm poměrně malý). Další příklad uvedu na typu značky svah, jestliže máte chodbu která je užší než jeden metr tak při použití značky svah v standardním nastavení dojde k vygenerování značky která bude interpretována jednou krátkou a jednou dlouhou úsečkou, což na výsledné mapě nevypadá optimálně.

Tak tedy jak na to

Pro pochopení tohoto návodu musíte mít zvládnuté alespoň základní znalosti o funkcionalitě programu therion.

Therion naštěstí disponuje funkcionalitou která nám umožní změnu těchto značek dle našich požadavků.

Změnu nám umožňuje nastavení v sekci layout v souboru thconfig (vstupní soubor therion compileru).

thconfig – příklad

layout homolak

#rozlišení
scale 1 100

#barva pozadí mapy
color map-bg 85 # dle barvy [100 100 100]

# barva mapy dle výšky
#color map-fg altitude

transparency on
opacity 90

# dopíše k osobam kteří měřili délku změřených poligonú
statistics topo-length on

# V jakém jazyku bude mapa
language cz

#Zobrazovat legendu
legend on
map-header 8 100 e

# nastavuje typ použitých symbolu SKBB/UIS/ASF/CCNP
#symbol-set SKBB

#zobrazovat jmena měřičských bodu
debug station-names

# nastaveni mřižky
grid bottom
grid-size 10 10 10 m

#rotace mapy
#rotate 30

#symbol-assign point station UIS
#symbol-hide point station

#Zrušit generování bodu (všeho)
#symbol-hide group all
#symbol-hide point section
#symbol-show line wall
#symbol-show line survey
#symbol-hide line flowstone

endlayout

export map -output output/homolak.pdf -layout homolak

Toto nastavení je příklad který se samozřejmě nemusí shodovat z Vašim nastavením, budeme jej ovšem používat v všech dalších příkladech

Změna značek – příprava

Pro změnu jakékoliv značky je nutné přidat do sekce layout následující kód který nám zpřístupní možnost změnu rozložení.

code metapost

endcode

Do této sekce budeme následně vkládat kód pro změnu.

Změna výplně (array) typu debris

Do sekce code metapost kterou jsme vytvořily v předchozím kroku vložíme následující kód.

def a_debris (expr p) =
T:=identity;
% thclean p;
pickup PenC;
path q; q = bbox p;
picture tmp_pic;
tmp_pic := image(
for i = xpart llcorner q step 1u until xpart urcorner q:
for j = ypart llcorner q step 1u until ypart urcorner q:
draw ((-.2u,0)–(.2u,0))
rotated uniformdeviate(360)
shifted ((i,j) randomized 0.6u) withpen PenC;
endfor;
endfor;
);
clip tmp_pic to p;
draw tmp_pic;
enddef;

Pokud nyní provedeme kompilaci mapy bude mapa stejná jako při originálním nastavení jelikož jsme neprovedli změnu nastavení.

Změnu provedeme v následujících řádcích

for i = xpart llcorner q step 0.8u until xpart urcorner q:
for j = ypart llcorner q step 0.8u until ypart urcorner q:

a

shifted ((i,j) randomized 0.4u) withpen PenC;

Pokud nyní vygenerujeme mapu bude již zřetelně viditelné zhuštění všech bodu.

Co jsme vlastně udělali, změnou hodnot 1u na 0.8u jsme řekli compileru aby značku debris (dle def a_debris) vykresloval v rozmezí 0.8u a dále změnu hodnoty randomized 0.6u na 0.4u aby značky otáčel v více náhodnějším pořadí

Takto může vypadat rozdíl při standardním a upraveném layoutu

bez nastavení 
 

 

a takto z nastavením 
 

Pokud není někomu jasné jak vložit code metapost do layout zde je celý příklad

layout homolak

#rozlišení
scale 1 100

#barva pozadí mapy
color map-bg 85 # dle barvy [100 100 100]

# barva mapy dle výšky
#color map-fg altitude

transparency on
opacity 90

# dopíše k osobam kteří měřili délku změřených poligonú
statistics topo-length on

# V jakém jazyku bude mapa
language cz

#Zobrazovat legendu
legend on
map-header 8 100 e

# nastavuje typ použitých symbolu SKBB/UIS/ASF/CCNP
#symbol-set SKBB

#zobrazovat jmena měřičských bodu
debug station-names

# nastaveni mřižky
grid bottom
grid-size 10 10 10 m

#rotace mapy
#rotate 30

#symbol-assign point station UIS
#symbol-hide point station

#Zrušit generování bodu (všeho)
#symbol-hide group all
#symbol-hide point section
#symbol-show line wall
#symbol-show line survey
#symbol-hide line flowstone

code metapost
def a_debris (expr p) =
T:=identity;
% thclean p;
pickup PenC;
path q; q = bbox p;
picture tmp_pic;
tmp_pic := image(
for i = xpart llcorner q step 0.8u until xpart urcorner q:
for j = ypart llcorner q step 0.8u until ypart urcorner q:
draw ((-.2u,0)–(.2u,0))
rotated uniformdeviate(360)
shifted ((i,j) randomized 0.4u) withpen PenC;
endfor;
endfor;
);
clip tmp_pic to p;
draw tmp_pic;
enddef;
endcode
endlayout

export map -output output/homolak.pdf -layout homolak

Změna výplně (array) typu blocks

Do sekce code metapost kterou jsme vytvořily v předchozím kroku vložíme následující kód.

def a_blocks (expr p) =
T:=identity;
pickup PenC;
path q, qq; q = bbox p;
picture tmp_pic;
uu := max(u, (xpart urcorner q – xpart llcorner q)/100, (ypart urcorner q – ypart llcorner q)/100);
tmp_pic := image(
for i = xpart llcorner q step 2.0uu until xpart urcorner q:
for j = ypart llcorner q step 2.0uu until ypart urcorner q:
qq := punked (((-.5uu,-.5uu)–(.5uu,-.5uu)–(.5uu,.5uu)–(-.5uu,.5uu)–cycle)
randomized (uu/2))
rotated uniformdeviate(360)
shifted ((i,j) randomized 1.6uu);
if xpart (p intersectiontimes qq) < 0:
thclean qq;
thdraw qq;
fi;
endfor;
endfor;
);
clip tmp_pic to p;
draw tmp_pic;
enddef;

Změnu provedeme v následujících řádcích

for i = xpart llcorner q step 1.0uu until xpart urcorner q:
for j = ypart llcorner q step 1.0uu until ypart urcorner q:

a

shifted ((i,j) randomized 1.0uu);

Pokud nyní vygenerujeme mapu bude již zřetelně viditelné zhuštění všech bodu.

Co jsme vlastně udělali, změnou hodnot 2.0uu na 1.0uu jsme řekli compileru aby značku blocks (dle def a_blocks) vykresloval v rozmezí 1.0uu a dále změnu hodnoty randomized 2.0uu na 1.6uu aby značky otáčel v více náhodnějším pořadí. Jak vidíte tak změna je velice podobná předchozímu příkladu.

Ostatní definice polí nebudu uvádět jelikož je možno je zjistit v zdrojovém souboru programu therion který je možno stahnout na therion.speleo.sk. Po stažení zdrojových souboru najdete definice v adresáři therion mpost thArea.mp. Pokud tento soubor otevřete naleznete zde seznam všech polí která jsou v programu THERION.

Například pole debris (které jsme použili v příkladu naleznete jako def a_debris_UIS ….. enddef; stačí tedy odstranit poslední část _UIS na def a_debris a vložit do thconfig a přepsat dle již zmiňovaného příkladu hodnoty. Hodnoty je možné samozřejmě ještě zmenšit pro generování ještě hustšího značení. Pokud ovšem zmenšíte hodnotu na příliš malou dojde v therion k chybě v průběhu generování, což Vám bude oznámeno v okně compileru. Stačí tedy opět zvětšit hodnotu a již se bude mapa generovat v pořádku.

Změna značky svah (slope)

Do sekce code metapost kterou jsme vytvořily v předchozím kroku vložíme následující kód.

def l_slope (expr P,S)(text Q) =
%show Q;
T:=identity;
numeric dirs[];
numeric lengths[];
for i=Q:
dirs[redpart i]:=greenpart i;
lengths[redpart i]:=bluepart i;
endfor;

li:=length(P); % last

alw_perpendicular:=true;

for i=0 upto li:
if unknown dirs[i]: dirs[i]:=-1;
else:
if dirs[i]>-1:
dirs[i]:=((90-dirs[i]) – angle(thdir(P,i))) mod 360;
alw_perpendicular:=false;
fi;
fi;
if unknown lengths[i]: lengths[i]:=-1; fi;
endfor;

%for i=0 upto li: show dirs[i]; endfor;

ni:=0; % next
pi:=0; % previous

for i=0 upto li:
d:=dirs[i];
if d=-1:
if (i=0) or (i=li):
dirs[i] := angle(thdir(P,i) rotated 90) mod 360;
pi:=i;
else:
if ni<=i:
for j=i upto li:
ni:=j;
exitif dirs[j]>-1;
endfor;
fi;
w:=arclength(subpath(pi,i) of P) /
arclength(subpath(pi,ni) of P);
dirs[i]:=w[dirs[pi],dirs[ni]];
% if (dirs[i]-angle(thdir(P,i))) mod 360>180:
% dirs[i]:=w[dirs[ni],dirs[pi]];
% message(„*******“);
% fi;
fi;
else:
pi:=i;
fi;
endfor;

%for i=0 upto li: show dirs[i]; endfor;

ni:=0; % next
pi:=0; % previous

for i=0 upto li:
l:=lengths[i];
if l=-1:
if (i=0) or (i=li):
lengths[i] := 1cm; % should never happen!
thwarning(„slope width at the end point not specified“);
pi:=i;
else:
if ni<=i:
for j=i+1 upto li:
ni:=j;
exitif lengths[j]>-1;
endfor;
fi;
w:=arclength(subpath(pi,i) of P) /
arclength(subpath(pi,ni) of P);
lengths[i]:=w[lengths[pi],lengths[ni]];
pi:=i;
fi;
else:
pi:=i;
fi;
endfor;

% for i=0 upto li: show lengths[i]; endfor;

T:=identity;
boolean par;
cas := 0.3u;
krok := 0.7u;
dlzka := (arclength P);
if dlzka>3u: dlzka:=dlzka-0.6u fi;
mojkrok:=adjust_step(dlzka,1.4u) / 2;
pickup PenD;
par := false;
forever:
t := arctime cas of P;
if t mod 1>0: % not a key point
w := (arclength(subpath(floor t,t) of P) /
arclength(subpath(floor t,ceiling t) of P));
if alw_perpendicular:
a := 90;
else:
a := w[dirs[floor t],dirs[ceiling t]];
fi;
l := w[lengths[floor t],lengths[ceiling t]];
else:
if alw_perpendicular:
a := 90;
else:
a:= dirs[t];
fi;
l:=lengths[t];
fi;

a := a + angle(thdir(P,t));

thdraw (point t of P) —
((point t of P) + if par: 0.333 * fi l * unitvector(dir(a)));
cas := cas + mojkrok;
par := not par;
exitif cas > dlzka + .3u + (krok / 3); % for rounding errors
endfor;
if S = 1: pickup PenC; draw P fi;
%pickup pencircle scaled 3pt;
%for i=0 upto li: draw point i of P; endfor;
enddef;

Tento příklad vypadá na první pohled více složitě, ale je to pouze zdání opět jsme nalezli definici v zdrojovém souboru THERION pod therion mpost thLine.mp z názvem def a_line_SKBB celý tento zdroj jsme překopírovaly do thconfig a odstranily _SKBB. Změnu provedeme pouze na jednom místě.

mojkrok:=adjust_step(dlzka,1.4u) / 5;

Pokud nyní vygenerujeme mapu bude na první pohled zřejmá změna hustoty této značky.

Změna značky převis (overhang)

Do sekce code metapost kterou jsme vytvořily v předchozím kroku vložíme následující kód.

def l_overhang (expr P) =
T:=identity;
cas := 0;
dlzka := arclength P;
mojkrok:=adjust_step(dlzka, 0.3u);
pickup PenC;
t1:=0;
forever:
t := arctime (cas + mojkrok/2) of P;
t2 := arctime (cas + mojkrok) of P;
thfill (subpath (t1,t2) of P) —
((point t of P) + .3u * unitvector(thdir(P,t) rotated 90)) —
cycle;
cas := cas + mojkrok;
exitif cas > dlzka – (2*mojkrok/3); % for rounding errors
t1:=t2;
endfor;
thdraw P;
enddef;

Změnu provedeme v

t := arctime (cas + mojkrok/5) of P;

Pokud nyní vygenerujeme mapu bude na první pohled zřejmá změna hustoty této značky.

Na závěr

Jednoduchost změn značek nám umožňuje plnohodnotné využití programu THERION při mapování malých jeskyní.

Zde popsané změny jsou pouze vybrané a ostatní můžete udělat sami dle posaného návodu. Veškeré podklady naleznete v adresáři therion mpost  kde dle mého názoru jsou jasně a zřetelně pojmenovány názvy souboru (thArea – pole, thLine – čáry, thPoint – body).

Děkuji mnohokrát za rady které mě poskytl Stacho Mudrák a Martin Budaj.

V současné době umožňuje therion pouze globální změnu všech značek dle informací které mám bude v brzké době možno definovat značky dle potřeby pro jednotlivou „část“ mapy. Až bude i toto možné budu Vás uživatele THERIONu informovat.

 

Pro případné informace se obracejte do therion fora.

Odkazy

therion.speleo.sk

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *