Vánoční nadílka Vánoční nadílka
Vánoční akce! Daruj lepší budoucnost blízkým nebo sobě. Až +50 % zdarma na dárkové poukazy. Více informací

Diskuze: Přepočet bodů GDI Polyline na okno když část trasy dočasně okno "opustí"

C a C++ C a C++ Přepočet bodů GDI Polyline na okno když část trasy dočasně okno "opustí" American English version English version

Aktivity (1)
Avatar
Caster
Člen
Avatar
Caster:10. září 12:54

Do FullHD okna vynáším trasy pomocí GDI funkce Polyline. GPS souřadnice mám uloženy jako unsigned int čísla (dword), kde pro kladnou hodnotu LAT (0° až 90°) je y= LAT * 1000 a pro zápornou hodnotu LAT (-90° až < 0°) y = ((-1) * LAT + 90) * 1000 a pro LON (0° až 360°) je x = LON * 1000. FullHD displej má rozměry 1980 x 1080 bodů a zeměpisné souřadnice LAT = 9 až -45°, LON = 40° až 116° (E)

Zkusil jsem: Upravené souřadnice, které mám k dispozici na tři desetinná místa, jsem převedl na celá čísla úpravou viz výše. Před použítím GDI funkce Polyline (hdc, *apt, cpt) přepočítám x (a y) na souřadnice obrazovky v cyklu počtu bodů trasy:

apt[i].x = (x - 40000) / (116000 - 40000) * 1920

Chci docílit: Trasa se mi ale vynese, jen pokud žádný z bodů nepřesáhne rozměry displeje. Jak upravit body Polyline aby se správně přepočetly na rozměry displeje vzhledem k jeho goegrafickým hranicím a jak ošetřit, když část trasy dočasně "opustí" rozměry displeje ? Šlo by na úpravu bodů použít např. nějakou funkci pro transformaci souřadnic ?

 
Odpovědět 10. září 12:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:10. září 13:30

Nejprve musíš zjistit, která souřadnice je poměrové dál než ta druhá. Př. Má-li souřadnici A[x,y] = A[11000,10000], pak poměr x = x / 1920 a poměr y = y / 1080. Z toho je patrné, že poměr y je větší než pomer x. Proto se budeš řídit dle osy y. A právě hodnota 1080 bude odpovídat hodnotě y, tedy hodnotě 10000. x hodnota bude (11000/10000)*1080. Poměr stran je zachován, všechny body se Ti vejdou do obrazovky a zároveň využíváš její maximální velikost.

Nahoru Odpovědět 10. září 13:30
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Caster
Člen
Avatar
Odpovídá na DarkCoder
Caster:10. září 13:54

Není mi jasné, jak to myslíš. Geografické rozměry obrazovky mám dané a nechci je zatím měnit, viděl bych méně bodů v oblasti, která mě zajímá. Problém je jen to, když část bodů (jejich souřadnice), "opustí" v průběhu trasy (počet bodů pro Polyline) geografickou oblast obrazovky.

 
Nahoru Odpovědět 10. září 13:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:10. září 14:18

Pokud nechceš měnit geografické rozměry, musíš vybrat z listu souřadnic ty, které vyhovují povolenému rozsahu. Při urcitem přiblížení máš nějaký koeficient a použití tohoto koeficientu spolu s testovanou souřadnici získas pozici na obrazovce. Pokud je tato pozice větší než rozsah obrazovky, posouvas se na další souradnici.

Nahoru Odpovědět 10. září 14:18
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Caster
Člen
Avatar
Odpovídá na DarkCoder
Caster:10. září 14:29

To by bylo dost náročné. Trasa může mít okolo 5 000 bodů a dočasně "opustit" obrazovku může jen malá část bodů. Problém je v tom, že nemohu předat Polyline záporné hodnoty souřadnic obrazovky, když dané body "opustí" geografickou plochu a nevím, jakou hodnotu pro takovéto body zadat. 0, 0 by odkazovalo na levý horní roh obrazovky. Je také možné, že Polyline vynese jen body, které jsou všechny "vykreslitelné". Body mohou trasu dočasně opustit i v několika úsecích. Ideální by asi bylo použit nějakou funkci, která by přes "matici" obrazovky vybrala body, které lze vykreslit, i když by pak trasa nebyla na obrazovce spojitá.

 
Nahoru Odpovědět 10. září 14:29
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:10. září 14:38

Testování 5000 souřadnic je otázkou několika desítek max stovek ms. Testuje se na platný rozsah obrazovky. S body, které jsou mimo, se nezaobiras. Tu funkci Ti od začátku popisuji.

Nahoru Odpovědět 10. září 14:38
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Caster
Člen
Avatar
Caster:11. září 11:56

V noci mě napadlo, jak na to. Pokud je LON souřadnice daného bodu vlevo za levým okrajem obrazovky, uložím x = 0. Už to funguje, jak má.

Ještě zkusím, zda bych ušetřil cyklus na přepočet GPS souřadnic na body na obrazovce pomocí funkce SetWorldTransform a SetMapMode MM_ANISOTROPIC.

Akceptované řešení
+5 Zkušeností
Řešení problému
 
Nahoru Odpovědět 11. září 11:56
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 7 zpráv z 7.