úterý 10. února 2015

Zamyšlení - procedura exclude

Proceduru -task jsem rámcově vysvětlil zde: Koncepce task.

Procedura -task má za cíl upřesnit kterou oblast chceme cyklicky zpracovávat. Znamená to, že -task není příkazem samo o sobě, pouze upřesňuje oblast v niž budeme provádět cyklickou činnost - výsledné obrazy se budou opakovat a skládat do čtverce s nižším LODem.

Nyní se naskytá otázka: co když daná oblast je příliš rozsáhlá? Například, uvnitř cílové oblasti LOD10 se nachází pravý horní roh o velikosti LOD11, který je v zahraničí, které je pokryto zimními fotografiemi, které jsou pro tvorbu pozemních textur nevhodné (ze zimních textur nejde udělat jarní, letní a podzimní textury). Chceme tuto oblast vyloučit z cílové oblasti, tzn. nic nechci ani ukládat, ani zpracovávat z dané oblasti.

Zatím ještě nevím jak to bude se získáváním zdrojů z této nežádoucí oblasti, protože prohlížení zdrojů bude obstarávat jiný program (AHK - Autohotkey). Nicméně AHK by mohl komunikovat s mým programem ohledně výpočtu a upřesnění oblasti, ve které má prohlížet mapu.

Procedura -exclude (...) nebo -exclude definition_file.ex by mohla upřesnit požadavek. Vyloučením určitých čtverců by se zmenšila oblast zpracování. Otázka je jestli chci příslušný LOD nadefinovat dovnitř závorek, nebo raději název souboru ve kterém budou bližší informace ohledně LODů, které mají být vyloučeny. Určitě se zde nabízí hned několik možností zápisu od jednoduchých až po složitější.

Syntaxe která mě napadá:
(n)(tabulátor)(x)(tabulátor)(y)
závorky byste nepsali, jen tabulátory mezi daty a místo n číslo LODu.
Předpokladem ale je, že tento čtverec, který chcete vyloučit z výsledků musí být uvnitř vašeho cílového čtverce.

Pokud by nebyl přímo uvnitř, protože byste chtěli vyloučit menší LOD než 1/4, např. 1/8 toho cílového LODu, pak by bylo přehlednější akceptovat tento přístup:

(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>(n+1_exclude)(tabulátor)(x_exclude)(tabulátor)(y_exclude)
Slovo n_cíl nahradíte za váš cílový LOD, který nechcete vyloučit. x_cíl a y_cíl jsou jeho souřadnice x,y. Vpravo však už je čtverec, který bude vyloučen a jelikož je LOD větší +1 proto jsem tam napsal n+1, což nahradíte za číslo LODU.

Takto by bylo možno zaměřit více konkrétních lodů a použít i hlubší nasměrování prostě jak kdybyste používaly tuto mapku.

Nakonec by se hodilo i nějaké zjednodušení pro případ, že chcete vyloučit dva lody najednou:
buď zleva, zprava, zezdola nebo zehora:
(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>l
(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>r
(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>u
(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>b

kde písmena l,r,u,b reprezentují anglické zkratky left,right,upper,bottom.

Další možné zjednodušení, které mě napadá, je nahradit první zápis písmeny:

(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>ul
(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>ur
(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>bl
(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>br

kde písmena ul,ur,bl,br reprezentují anglické zkratky upper left,upper right,bottom left a bottom rigght.

Tím byste vůbec nemuseli psát souřadnice. Toto je už poměrně slušné zjednodušení zápisu:

(n_cíl)(tabulátor)(x_cíl)(tabulátor)(y_cíl)>ul>ul

Příklad:
10 552 346>ul>r
LOD 10 Severozápadní čtverec Prahy by byl čtverec, který chcete zpracovat. Přiblížíte si upper left (čtverec LOD11 nahoře zleva) a v něm vidíte napravo velký zelený prostor sloupec LOD10, který se zezhora "nezdá být osídlen". Či-li ty dva čtverce napravo nebudeme stahovat (nebo zpracovávat).

Je třeba zdůraznit, že -exclude by měl být aplikován pouze v případech výjimek a na takové čtverce, které nebudou procedurálně zahrnuty. Pokud například budu vyžadovat spojení mnoha souborů do jednoho souboru, abych mohl vytvořit masku o nižším LODu, ale tento LOD bude zasahovat do oblasti kterou jsem vyloučil, pak nebude možné takové sloučení masek provést protože nebudu mít potřebné data.

Aktualizováno - Task:
Celá věc se dá zjednodušit. Proč nenapsat rovnou jeden soubor task, tedy s koncovkou .tsk, který bude obsahovat jak cílovou oblast, tak vyloučené oblasti. V podstatě by člověk rovnou za parametr -task uvedl soubor s definicemi zdrojové oblasi.

Otázka, kterou je třeba vyřešit:
- psát definice include a definice exclude zvlášť nebo pouze definice exclude?

Dále, se mi zdá praktičtější používat jiný oddělovač než tabulátor, protože zápisy by mohly být delší (na drouhou stranu někomu může vyhovovat tabulátor kvůli kopírování dat z tabulkového procesoru). Napadlo mě podtržítko, to se už ale používá u regulárního výrazu -r regex , který se však vztahuje k názvům zdrojových souborů a předpokládá se, že obyčejně druhým číslem je y, třetím x, tedy naopak než u parametru task:include/exclude. Pomlčka by zase mohla mít lepší využití, ta by mohla sloužit jako symbol pro to jestli má být následující oblast vyloučena. Kdežto znaménko "+" by se dalo použít naopak jako definici toho co má být zahrnuto. Možná nejjednodušším a nejdostupnějším oddělovačem by byla obyčejná tečka (nebo čárka).

Příklad:

10.552.346->ul>r

To zprvu vypadá jako jedno číslo, ale jsou to tři čísla. Oblast lodu 10, x=552 a y=346. Následující pomlčka by znamenala, že následující má být vyloučeno: z oblasti vnořeného lodu vlevo nahoře (LOD11) bychom vyloučili pouze oblast vpravé polovině, tj. celkem by byly vyloučeny pouze dva čtverce LODu 12.

Pokud byste chtěli zpracovat další oblasti (nikoliv vyloučit, ale zahrnout do výsledku) mohli byste pokračovat takto:
10.552.346->ul>r

10.553.346+
10.554.346+
Což by znamenalo, že si přejete stáhnout (nebo zpracovat) 3 čtverce LODu 10, ale jen z prvního byste něco vyloučili.

Nejlepší řešení bude, když si hned na začátku souboru budete moci nadefinovat pořadí čísel x,y

Nakonec, nepředpokládám, že by bylo vhodné soubor používat tak, abyste stahovali/upravovali čtverce s odlišnou velikostí, proto si myslím že by vlastně stačilo nadefinovat nejdříve tyto údaje, které by následně platili pro celý soubor:

@N  # maximální počet includů a excludů v souboru dohromady (urychlí parsování souboru)
$13 11 # První číslo označuje zoom zdrojových (tj. původních) souborů čili "level of detail"; druhé číslo je nepovinné a mělo by být použito pouze pokud chcete soubory sdružovat do nadřazených celků o jiném LODu (užití například při -join spojování obrazů nebo u exportu textur do bgl souborů)
(x,y) # znaky x,y označují pořadí, ve kterém chcete zadávat údaje - zde by bylo možná lepší použit opět obrácené pořadí, aby se vám to nepletlo, když obrazové soubory budete mít uložené ve smysli n_y_x.jpg kvůli přehlednému seřazení. Takto se dají soubory snadněji představit, když je uspořádáte do mřížky zezhora dolů.A pak už byste psali jen n,x,y+... nebo n,x,y-..>... atd.

Oddělovač, který je použit uvnitř (x,y) může posloužit jako definice oddělovače. Změňte na (y.x) a můžete psát ve formátu n.y.x+... n.y.x-..>.. apod.

Předpokládá se, že zpracovávání textur bude probíhat po menších dílech, takže takový postup by měl být ideální. Je však možné, že budete potřebovat více druhů souborů task, protože v každém můžete mít jiné LODy (čtverce), případně.si můžete číslovat soubory podle toho co který den uděláte: 01.01.tsk může být práce udělaná 1.1. a skončíte někdy 31.12. takže 31.12.tsk bude název posledního souboru.

Ještě jednou vysvětlím proč jsem přidal $. Program potřebuje znát nejen cílovou oblast, ve které chcete provádět stahování či editace souborů, ale také v jaké velikosti jsou ty stažené nebo editované soubory tedy v jakém zoomu/levelu jsou. Zatímco hlavní údaj LOD, představuje skupinu souborů, dolar $ mu řekne, jak se budou jmenovat osubory se kterými bude později pracovat. Na prvním místě je číslo zdrojového souboru a na druhém číslo souboru, do kterého se to sloučí. Jen pro jistotu dám zjednodušený příklad: 
kdybyste chtěli editovat 4 soubory o zoomu 1: máte 4 čtverce o souřadnicích x,y: 0,0; 1,0; 0,1; 1,0; když je zeditujete a sloučíte dohromady, výsledný soubor bude mít číslo 0_0_0.jpg nebo 0_0_0.bgl protože výsledek bude úroveň nula a číslo souboru 0_0. Mimochodem: tady je krásně vidět, proč nestačí pojmenovávat soubory jen údajem 0_0, protože první soubor o zoomu 1 má stejné číslo jako první soubor o zoomu 0, ale to je spíš taková vzácná výjimka.
Mapka čtverců

PŘÍKLAD 2:

# Mapa Evropy v zoomu 4/3: zahrnuje i kousek severní Afriky
@10  # maximální počet includů a excludů v souboru dohromady (urychluje parsování souboru)
$4 3 # První číslo původní zdrojové soubory; druhé číslo je nepovinné a mělo by být použito pouze pokud chcete soubory sdružovat do nadřazených celků o jiném LODu
(x.y) # znaky x,y označují pořadí, ve kterém chcete zadávat údaje, zároveň zde definujete oddělovač
3.4.2+ # celý čtverec 4,2 v zoomu 3
3.3.2->l # čtverec 3,2 v zoomu 3 kromě horních dvou čtverců v zoomu  4
3.3.3+>tr# ze čtverece 3,3 v zoomu 3 se zahrne pouze roh vpravo nahoře (zoom 4)
3.4.3+>t # ze čtverece 4,3 v zoomu 3 se zahrnou pouze dva čtverce nahoře (zoom 4)

Poznámka:
Vyloučit tři pod-čtverce znamená zahrnout jeden a naopak. V příkazu je možné pracovat jen se dvěma čtverci, zbytek se odvodí..Program funguje tak, že si dopočítá čísla čtverců, se kterými chcete pracovat a čísla čtverců se kterými pracovat nechcete, takže pokud se pokusíte zpřístupnit nějakou úroveň, která je mimo dosah toho co jste definovali pomocí $a... kde a je číslo definující zdrojový level/zoom... tak dostanete chybovou hlášku.

Následující zápisy by měly být ekvivalentní:
3.4.3+>t
3.4.3+>t+
3.4.3>t+
3.4.3>t
Pro vyloučení by platilo exvyvalentně:
3.4.3->t
3.4.3->t-
3.4.3>t-
V případě že potřebujete provést v daném čtverci vícero vyloučení by mělo platit:
3.4.3->
-tl>lt
-tr>lt
-bl>lt
-br>lt
V případě že potřebujete provést v daném čtverci vícero zahrnutí by mělo platit:
3.4.3+>
+tl>lt
+tr>lt
+bl>lt
+br>lt
Tzn. nejdříve napíšete tři čísla definují zoom,x,y pak dáváte znaménko informující jestli bude zahrnovat nebo vylučovat. Znaménko > pokračující znakem nového řádku informuje o tom, že bude následovat série příkazů. Když si čtverec 4,3 rozdělíte na čtyři čtverce top-left, top-right, bottom-left a bottom-right, tak z každého následně zahrnu levý horní roh (na pořadí písmen by nemělo záležet). Protože na konci řádku není znaménko > tak se ji6 hloub2ji nepostupuje, ale teoreticky i to by bylo možné:
3.4.3+>
+tl>t>
tl
+tl>t>
bl
+bl>lt
+br>lt
Na předchozím příkladu vidíte že dvakrát zahrnuji ze stejného pod-čtverce a pak pokračuji čtverci o větším zoomu.

Žádné komentáře:

Okomentovat