IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

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

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Caster
Člen
Avatar
Caster:10.9.2018 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.9.2018 12:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:10.9.2018 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.9.2018 13:30
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Caster
Člen
Avatar
Odpovídá na DarkCoder
Caster:10.9.2018 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.9.2018 13:54
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:10.9.2018 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.9.2018 14:18
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Caster
Člen
Avatar
Odpovídá na DarkCoder
Caster:10.9.2018 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.9.2018 14:29
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Caster
DarkCoder:10.9.2018 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.9.2018 14:38
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Caster
Člen
Avatar
Caster:11.9.2018 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.9.2018 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.