Diskuze: Nalezení výšky bodu z vrstevnic
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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.
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.
./\. 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.
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
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...
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á.
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.
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ší.
Zobrazeno 11 zpráv z 11.