Převod souřadnic z uint32_t na float – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod souřadnic z uint32_t na float – C / C++ – Fórum – Programujte.comPřevod souřadnic z uint32_t na float – C / C++ – Fórum – Programujte.com

 

oxidián0
Grafoman
8. 3. 2015   #1
-
0
-

Našel jsem na netu tuto funkci, nevím v jakém je jazyce ale vypadá to podobné jako v C/C++ ale nejsou tam typy:

public static List<double> GetBoundingCoordinates(uint boundingValue)
{
    var list = new List<double>();
    var shiftValue = 15;
    var work = boundingValue;
    var latitudeData = (uint)0;
    var longitudeData = (uint)0;

    while (work < 0x80000000 && shiftValue >= 0)
    {
        shiftValue--;
        work *= 4;
    }
    work &= 0x7FFFFFFF;    // Remove negative flag, if any
    var powerOfTwo = shiftValue;

    while (shiftValue >= 0)
    {
        if (work >= 0x80000000)
        {
            latitudeData += (uint)(1 << shiftValue);
        }

        if ((work & 0x40000000) != 0)
        {
            longitudeData += (uint)(1 << shiftValue);
        }
        work *= 4;
        shiftValue--;
    }

    // factor = 1.0 / (2^i)
    var factor = 1.0 / (1 << powerOfTwo);

    // Calc bounding coordinates
    var minLatitudeDeg = 90.0 - ((latitudeData + 1.0) * factor * 360.0);
    var maxLatitudeDeg = 90.0 - (latitudeData * factor * 360.0);
    var minLongitude = (longitudeData * factor * 480.0) - 180.0;
    var maxLongitude = ((longitudeData + 1.0) * factor * 480.0) - 180.0;
    
    list.Add(minLatitudeDeg);
    list.Add(maxLatitudeDeg);
    list.Add(minLongitude);
    list.Add(maxLongitude);
    return list;
}

Načetl jsem z hlavičky binárního souboru tuto hex hodnotu: E8 07 02 00 a to by zřejmě mělo odpovídat tomuto: MinLatitude(Deg) = 46.40625. Mám celkem 4 čísla, které potřebuju převést, ale to číslo už mám načtené v uint_32 (případně bych to mohl načíst jako int). Mohli byste mi s tím pomoct převést do C?
 

PS:

Možná jsem to nepochopil správně, ale z toho čísla E8 07 02 00 asi ta funkce má vytáhnout 4 hodnoty:
MinLatitude(Deg) = 46.40625
MaxLatitude(Deg) = 47.8125
MinLongitude(Deg) = -75.0
MaxLongitude(Deg) = -73.125

Nechápu výpočet...

Nahlásit jako SPAM
IP: 78.45.199.–
KIIV
~ Moderátor
+43
God of flame
8. 3. 2015   #2
-
0
-

Pravdepodobne C# ... Java to byt nemuze, ta nema nic jako  "var". V novejsi verzi c++ by se muselo pouzit auto.

Vypocet pochopis tak, ze budes pocitat co se tam deje rucne.

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
BDS+3
Věrný člen
8. 3. 2015   #3
-
0
-

#1 oxidián
Je to C#

a si takto by se to dalo: 

void GetBoundingCoordinates(unsigned int boundingValue, double *minLatitudeDeg,
							double *maxLatitudeDeg, double *minLongitude, double *maxLongitude)
{
	float factor;
	int powerOfTwo, shiftValue = 15;
	unsigned int work = boundingValue;
	unsigned int latitudeData = 0;
	unsigned int longitudeData = 0;

	while (work < 0x80000000 && shiftValue >= 0)
	{
		shiftValue--;
		work *= 4;
	}
	work &= 0x7FFFFFFF;    // Remove negative flag, if any
	powerOfTwo = shiftValue;

	while (shiftValue >= 0)
	{
		if (work >= 0x80000000)
		{
			latitudeData += (unsigned int)(1 << shiftValue);
		}

		if ((work & 0x40000000) != 0)
		{
			longitudeData += (unsigned int)(1 << shiftValue);
		}
		work *= 4;
		shiftValue--;
    }

	// factor = 1.0 / (2^i)
	factor = 1.0 / (1 << powerOfTwo);

	// Calc bounding coordinates
	*minLatitudeDeg = 90.0 - ((latitudeData + 1.0) * factor * 360.0);
	*maxLatitudeDeg = 90.0 - (latitudeData * factor * 360.0);
	*minLongitude = (longitudeData * factor * 480.0) - 180.0;
	*maxLongitude = ((longitudeData + 1.0) * factor * 480.0) - 180.0;
}

netestoval jsem a nezkoumal kód, pouze nahradil to, co C nesežere

Nahlásit jako SPAM
IP: 31.47.99.–
W11 :)
oxidián0
Grafoman
8. 3. 2015   #4
-
0
-

Získal jsem ze souboru těchto šest souřadnic (uint32_t):

140215309

140215320

140215311

2880110592

2880154539

4277054379

Místo pole jsem použil struct:

typedef struct LONLAT_ {
    uint32_t minLat;
    uint32_t maxLat;
    uint32_t minLon;
    uint32_t maxLon;
} LONLAT_t;

Použil jsem na to tuto funkci:

http://paste.ofcode.org/9zq2aDf9wkabdXAn8BKgdh

a vyšly mi podivné výsledky:

Výsledky 1. až 3. jsou 50 ; 50 ; 17 ; 17 (tj. minLat, maxLat, minLon, maxLon

4. výsledek: 4294967029; 4294967029; 4294967180; 429496718055.

5. výsledek: 50; 50 ; 17; 17

6. výsledek se rovný výsledku 4.

Asi mi to nefunguje takže se teď podívám na tu funkci od BDS.

Edit:
Zkusil jsem:

typedef struct LONLAT_ {
    float minLat;
    float maxLat;
    float minLon;
    float maxLon;
} LONLAT_t;

A to už dává lepší čísla (jsou tam desetinné čárky a záporné čísla).

Pak jsem zkusil změnit:

    int latitudeData = (uint32_t)0;
    int longitudeData = (uint32_t)0;

 na


    uint32_t latitudeData = (uint32_t)0;
    uint32_t longitudeData = (uint32_t)0;

a to zas dává úplný nesmyslný čísla něco jako 0 ; 7.85946158e+033 ; 5.88870456e-039 ; 8.44897355e-039

Nahlásit jako SPAM
IP: 78.45.199.–
BDS+3
Věrný člen
8. 3. 2015   #5
-
0
-

ještě malá chybka: místo float factor dej double factor

Nahlásit jako SPAM
IP: 31.47.99.–
W11 :)
oxidián0
Grafoman
8. 3. 2015   #6
-
0
-
Nahlásit jako SPAM
IP: 78.45.199.–
BDS+3
Věrný člen
8. 3. 2015   #7
-
0
-

#6 oxidián
pokud dostáváš stejné výsledky, tak ta funkce bude asi dělat, to co dělat má, takže chybu máš někde jinde.

Já Ti přesně řeknu kde je chyba - ty řešíš stejný problém v pěti vláknech, předpokládám, že nikdo ani nechápe co řešíš.

Dám Ti radu pokus se pečlivě vysvětlit co vlastně děláš, ukaž jak to děláš, co přesně je blbě a snaž se udržet související problémy v jednom vlákně. Pro vkládání kódu používej tlačítko <?, ať je kód přehledný  a na jednom serveru spolu s tématem.

Nahlásit jako SPAM
IP: 31.47.99.–
W11 :)
oxidián0
Grafoman
9. 3. 2015   #8
-
0
-

Pokud si dobře pamatuji tak za včerejšek vlákna byly dvě a neřešil jsem v nich jednu a tu samou věc.

Dotaz:

Mohl by mi někdo napsat opačný algoritmus k tomuto?

float LongitudeDeg = argv[1]; // sem dosaď nějakou z. délku
float LatitudeDeg = argv[2]; // sem dosaď nějakou z. šířku
uint32_t u,v,l,n;
l=15;

LongitudeData = int(0.5 + (180 + LongitudeDeg) * (0x2000000 / 15));
LatitudeData = int(0.5 + (90 - LatitudeDeg) * (0x8000000 / 45));

if ( LongitudeData > 0x30000000)
	LongitudeData -= 0x30000000;
if (LongitudeData < 0)
	LongitudeData += 0x30000000

if ( LatitudeData > 0x20000000 )
	LatitudeData -= 0x20000000;
if ( LatitudeData < 0 )
	LatitudeData += 0x20000000);

n = 30 - l;
u = LongitudeData >> n;
v = LatitudeData >> n;

Asi tam bude třeba smyčka while jako tomu je v té funkci nahoře, a tohle já neovládám. Tady ten výpočet je relativně snadný protože tam jsou podmínky, ale jak to reverzovat abych když zadám l,u,v dostal zeměpisnou šířku a zeměpisnou délku? Teoreticky by možná šel výpočet i bez l?

Nahlásit jako SPAM
IP: 78.45.199.–
oxidián0
Grafoman
9. 3. 2015   #9
-
0
-

Pokud jde o tu první funkci tak jsem zjistil, že jsem pracoval s nesprávným souborem a proto jsem dostal nesprávné vstupní data. Nicméně, i když mám správný soubor tak tam není stejné číslo které jsem tam čekal, proto mi vycházel jiný výsledek.

Nahlásit jako SPAM
IP: 78.45.199.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 21 hostů

Podobná vlákna

Převod 32 Int na float — založil Jakub Kohout

Uint32_t na pole uint8_t — založil Herm

Hodnoty souradnic krivky — založil Artemij

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý