Earth - algoritmus

 

Algoritmů, jak namapovat bitmapu na povrch koule bude více. Tento je však můj. Postupoval jsem takto.

Rozdělím kouli na tolik poledníků a rovníků, kolik je tam pixelů.

 

Poledníků bude celkem tolik, jaký je obvod koule.

Rovníků bude tolik, jaký je průměr koule.

 

Samotné mapování 2D bitmapy na povrch koule dělám tak, že spočítám vzdálenost od polu Ly a od nultého poledníků Lx.

Tyto hodnoty budou ukazateli do 2D bitmapy, kterou musím rozměrově upravit tak, aby rozměr odpovídal rozbalené kouli.

Tedy X = obvod, Y = obvod / 2

 

Potřebuji pro každý bod koule vypočítat Ly a Lx.

 

EarthFig1

 

EarthFig2

 SIN alfa = x / r

 Lx = obvod v řezu * alfa

EarthFig3

COS beta = (r - y) / r

 Ly = obvod v řezu * beta

 

 

Dále následují jen rychlostní úpravy.

Není možno objekt animovat a přitom u každého pixelu používat pro výpočet goniometrické funkce, děleno, nebo násobení. Tyto matematické operace je potřeba obejít. Proto jsem vytvořil extra buffery, které by měly být pochopitelné přímo z kodu.

 

Oběžná dráha měsíce je realizována jako obyčejný pohyb po elipse.

 


        public void ObeznaDraha(double uhel)
        {
            if (uhel <= 0) úhel = 360;

            double uhelRad = uhel * Math.PI / 180;
            double rozdílX = (PolomerOtaceni*1.5) * Math.Cos(uhelRad);
            double rozdílY = (PolomerOtaceni/2.4) * Math.Sin(uhelRad);
            PoziceX = Convert.ToInt32(RotacniBodX + rozdílX);
            PoziceY = Convert.ToInt32(RotacniBodY + rozdílY);
        }

 

a stín je udělán opravdu jednoduše. Jako parametr do průhlednosti. Nechtělo se mi tím už zabývat, ale vypadá to tak lépe, proto jsem to tam u verze EXE nechal.

 

 





Kontakt M: 724 085 607 E: info@bura.cz

© Bura.cz