NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Michal Hadraba:21.10.2023 10:42

Mám soubor dat reprezentující vrstevnice:

struct Point
{double x y;}

struct Usek
{Point start, end;}

class Vrstevnice
{std::vector<Usek> vecOfUseky;}

a seznam vrstevnic, podle vysky vrstevnice:

std::map<double, Vrstevnice>

Vše ve 2d prostoru, samozřejmě.
A úkol zní, jak zjistit výšku bodu někde mezi těmito vrstevnicemi. Výška se zjišťuje interpolaci podle nejbližších vrstevnic.

Zkusil jsem: Hledat různě ve fórech, asi je to spíš geometrický problém než čistě programatorsky.

Chci docílit: Přidělit zadané trase (třeba vodovodu) podle zadaných vrstevnic. Výškové body na úseku trasy se najdou snadno podle pruseciku s vrstevnicemi, ale problém je s lomovymi body.

 
Odpovědět
21.10.2023 10:42
Avatar
Michal Hadraba:21.10.2023 10:49

Ilustrativní schema

 
Nahoru Odpovědět
21.10.2023 10:49
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Hadraba
DarkCoder:22.10.2023 13:26

To je dosti komplexní téma, které bývá zadáváno pro bakalářské práce. :-) Jak správně uvádíš, výška bodu se určuje interpolací. Je třeba určit data která použiješ pro interpolaci. Je tedy třeba nejprve určit mezi kterými vrstevnicemi se bod nachází. První určíš snadno. Je to ta jejíž bod je nejblíž bodu jehož výšku chceš určit. Druhá musí být naproti, ne za první vrstevnicí. Body na těchto vrstevnicích pak použiješ k výpočtu výšky bodu pomocí vhodné interpolace (např. Spline, Kriging, a další).

Vrstevnice je vlastně kolekce bodů jdoucích za sebou. Není třeba uvádět úsek.

#include <vector>
#include <map>

struct Point {
    double x;
    double y;
};

struct Contour {
    double elevation;
    std::vector<Point> points;  // Pole bodů na vrstevnici
};

int main() {
    std::map<double, Contour> contourMap;  // Mapa pro ukládání vrstevnic podle nadmořské výšky

    // Přidání vrstevnic do mapy
    Contour contour1;
    contour1.elevation = 100.0;
    contour1.points.push_back({10.0, 20.0});
    contour1.points.push_back({15.0, 25.0});
    contourMap[contour1.elevation] = contour1;

    Contour contour2;
    contour2.elevation = 200.0;
    contour2.points.push_back({12.0, 22.0});
    contour2.points.push_back({18.0, 28.0});
    contourMap[contour2.elevation] = contour2;

    // ...

    return 0;
}

Ano, spíše než programátorský problém má tento problém geodetický a topografický charakter.

Podívej se na netu na téma: Contour maps, Contour lines interpolation, Spatial interpolation, apod.

Nahoru Odpovědět
22.10.2023 13:26
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Michal Hadraba:22.10.2023 15:24

Dík, kouknu.
Pokud bude mít vrstevnice jenom body, musí jít za sebou. A musí to být jenom jedna polyline. Úseky jsou tam proto, že vrstevnice může být složená z více částí... Ale to už je detail.

 
Nahoru Odpovědět
22.10.2023 15:24
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.10.2023 13:09
./\.   spicka
/..\
.... _
.../.....\
/...........\

.. _
./...  \....
/..........\  postupne se rozvolnuje

.. _
./...  |___....ale, take to muze byt takovyto zub
/.............|

./...  |..nebo takovyto
/.......\-----;

Vrstevnice rika jen nadmorskou vysku vrstvy hliny mezi vyskou A a B. Nemuzes interpolovat nejakou vysku nahodne, kdyz neznas zakriveni kopce :)
Ano, muzes bod propojit v nejkratsi vzdalenosti k nejblizsim vrstevnicim a odhadnout procenta pri zakriveni 45% nebo odhadnout i zakriveni pomoci bezierovych krivek a propojeni toho bodu s dalsimi vrstevnicemi. Ale, stale pujde o odhad, rekneme 30%, skutecnost muze byt odlisna.

 
Nahoru Odpovědět
23.10.2023 13:09
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:23.10.2023 13:16

bod A je mezi 288 a 290. je asi 40% od cary 288 a 60% od cary 290.
290-288 = 2
40% ze 2 je 0.8
bod A ma vysku 288+0.8

bod B 30 / 70 mezi 291 a 292 = 291.3
bod C 50 / 50 mezi 291 a 292 = 291.5

Ale, urcite existuje primo nejaky vzorecek, jak se to pocita, staci googlovat. Tahle bych to pocital ja, zjednodusene

 
Nahoru Odpovědět
23.10.2023 13:16
Avatar
Odpovídá na Peter Mlich
Michal Hadraba:23.10.2023 13:17

Tomu rozumím. Ovšem pro moje účely je interpolace dostatečná. Jedná se o generování podélných profilů inženýrských sítí. Ty jsou jednak vedené v rovinatějším území, na Sněžku vodovod nevede, jednak přesnost terénu +/- 30 cm nikoho nezabije.
Samozřejmě, pokud budeme mít bod na vrcholu kopce a budeme interpolovat lineárně podle poslední vrstevnice, může nám chybět klidně 0,5 metru. Nebo v údolnici...

 
Nahoru Odpovědět
23.10.2023 13:17
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Peter Mlich
DarkCoder:23.10.2023 14:52

To co provádíš pro výpočet výšky mezi dvěmi vrstevnice je lineární interpolace, která navíc má svá pravidla. Záleží na přesnosti a pro správnou funkci je třeba brát dva správné body. Výsledek bude v rozsahu výšek vrstevnic, ale nepřesný. První nepřesnost tkví v tom, že terén nebude lineární, druhá nepřesnost tkví v tom, že interpolaci provádíš s body, které neleží v přímce.

Při použití lineární interpolace pro určení výšky bodu mezi dvěmi vrstevnicemi je třeba, aby body na vrstevnici A, bod mezi vrstevnicemi a body na vrstevnici B tvořily přímku nebo úsečku. Lineární interpolace pracuje s předpokladem, že tři body tvoří přímku.

Pokud body na vrstevnicích A a B, spolu s cílovým bodem, nejsou na přímce, může lineární interpolace poskytovat nepřesné výsledky.

Pro určení výšky bodu mezi vrstevnicemi, kde body nejsou na přímce, by bylo vhodné použít pokročilejší metody interpolace. Ty jsem zmínil ve svém úvodním příspěvku.

Na druhou stranu pokud se nelpí tolik na přesnosti je tato metoda velmi rychlá.

Nahoru Odpovědět
23.10.2023 14:52
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Michal Hadraba:24.10.2023 13:17

Zajímavé téma. Ono interpolovat vrstevnice by se mělo po spádnici. Což je víceméně kolmice na vrstevnici. Takže pokud budou vrstevnice rovnoběžné, Lze to udělat poměrně přesně. Samozřejmě, pokud zanedbáme zakřivení terénu (a zeměkoule(-:).
Šlo mi spíš o to, jak najít ty spravné dva body (nebo úseky) v hromadě vrstevnic.

 
Nahoru Odpovědět
24.10.2023 13:17
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Hadraba
DarkCoder:24.10.2023 15:06

To bezesporu, neboť se to používá v mnoha odvětvích (typografie, meteorologie, počítačová grafika, a další). Spádnice zde bude hrát významnou roli. Spádnice by byla kolmicí pokud by byly vrstevnice k sobě rovnoběžné. Čím více by vrstevnice tvořila křivku tím více by i spadnice byla křivkou. Ono přesně i u rovnoběžných vrstevnic je hodně usmevny pojem, protože chyba může být úplně stejná jako u nerovnoběžných vrstevnic. Jelikož se nezná profil objektů, může chyba v obou případech dosáhnout 50% rozdílu hodnot obou vrstevnic. Pokud by byly vrstevnice rovnoběžné, pak nejbližší body na vrstevnicích k bodu mezi vrstevnicemi tvoří přímku a můžeš tak použít lineární interpolaci. Chyba bude max 50% když budeš brát v potaz pálení rozdílu hodnot vrstevnic. Pro kopečky, jejichž tvar se dá předpovídat bude mít sofistikovaná interpolace svůj význam. Pro hory, kde tvar může být různý postačí páůlení vrstevnic. Čím lepší rozlišení mapy, tím líp.

Najít první bod je snadné, je to bod na nějaké vrstevnici jehož vzdálenost je nejkratší. Pak musíš najít druhou vrstevnici A znát její hodnotu. Pro hory použiješ půlení, pro kopce (teren jehož profil lze predpokladat) to bude složitější. :-)

Nahoru Odpovědět
24.10.2023 15:06
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.