Master class "vianočné gule" vyrobené z papiera s vlastnými rukami. Guľa z dvoch trojuholníkov

Sférický trojuholník a jeho použitie.

guľový trojuholník- geometrický útvar na povrchu gule, vytvorený priesečníkom troch veľkých kružníc. Tri veľké kruhy na povrchu gule, ktoré sa nepretínajú v jednom bode, tvoria osem guľových trojuholníkov. Nazýva sa sférický trojuholník, ktorého všetky strany sú menšie ako polovica veľkého kruhu Euler.

Strana guľového trojuholníka sa meria hodnotou stredového uhla, ktorá z nej vychádza. Uhol guľového trojuholníka sa meria hodnotou dihedrálneho uhla medzi rovinami, v ktorých ležia strany tohto uhla. Vzťahy medzi prvkami sférických trojuholníkov sú študované sférickou trigonometriou.

Vlastnosti sférického trojuholníka:

  1. Okrem troch podmienok rovnosti rovinných trojuholníkov platí pre sférické trojuholníky ešte jedna: dva sférické trojuholníky sú rovnaké, ak sú ich zodpovedajúce uhly rovnaké.
  2. Pre strany guľového trojuholníka platia 3 trojuholníkové nerovnosti: každá strana je menšia ako súčet ostatných dvoch strán a väčšia ako ich rozdiel.
  3. Súčet všetkých strán a + b + c je vždy menší ako 2πR.
  4. Veličina 2πR − (a + b + c) sa nazýva sférický defekt
  5. Súčet uhlov guľového trojuholníka s = α + β + γ je vždy menší ako 3π a väčší ako π
  6. Množstvo sa nazýva sférický prebytok alebo sférický prebytok
  7. Oblasť guľového trojuholníka je určená vzorcom.
  8. Na rozdiel od plochého trojuholníka môže mať guľový trojuholník dva alebo dokonca tri 90° uhly.

Spomedzi všetkých sférických mnohouholníkov je najzaujímavejší sférický trojuholník. Tri veľké kruhy, ktoré sa v dvoch bodoch pretínajú, tvoria na gule osem guľových trojuholníkov. Keď poznáte prvky (strany a uhly) jedného z nich, môžete určiť prvky všetkých ostatných, preto zvážte vzťah medzi prvkami jedného z nich, toho, v ktorom sú všetky strany menšie ako polovica veľkého kruhu. Strany trojuholníka sú merané plochými uhlami trojstenného uhla OABS, uhly trojuholníka sú merané dvojstennými uhlami rovnakého trojstenného uhla, pozri obr.

Vlastnosti guľových trojuholníkov sa v mnohom líšia od vlastností trojuholníkov v rovine. Takže k známym trom prípadom rovnosti pravouhlých trojuholníkov sa pridáva štvrtý: dva trojuholníky ABC a A`B`C` sú rovnaké, ak tri uhly PA = RA`, PB = PB`, PC = PC ` sú rovnaké, resp. Podobné trojuholníky teda na guli neexistujú, navyše v sférickej geometrii neexistuje pojem samotnej podobnosti, keďže neexistujú žiadne transformácie, ktoré menia všetky vzdialenosti rovnakým (nie rovným 1) počtom krát. Tieto črty sú spojené s porušením euklidovskej axiómy o rovnobežkách a sú tiež vlastné Lobačevského geometrii. Trojuholníky, ktoré majú rovnaké prvky a rôznu orientáciu, sa nazývajú symetrické, ako napríklad trojuholníky AC`C a BCC`

Súčet uhlov ktoréhokoľvek guľového trojuholníka je vždy väčší ako 180°. Rozdiel RA + RV + RS - p \u003d d (meraný v radiánoch) - je kladná hodnota a nazýva sa sférický prebytok daného sférického trojuholníka. Plocha sférického trojuholníka: S = R2 d, kde R je polomer gule a d je sférický presah. Tento vzorec bol prvýkrát publikovaný Holanďanom A. Girardom v roku 1629 a pomenovaný po ňom.

Ak vezmeme do úvahy uhlopriečku s uhlom a, potom pri 226 = 2p/n (n je celé číslo) možno guľu rozrezať na presne n kópií takéhoto digonu a plocha gule je 4pR2 = 4p pri R = 1, takže plocha digonu je 4p / n = 2a. Tento vzorec platí aj pre a = 2pt/n, a teda platí pre všetky a. Ak budeme pokračovať v stranách guľového trojuholníka ABC a vyjadríme plochu gule z hľadiska plôch uhlopriečok vytvorených v tomto prípade s uhlami A, B, C a jej vlastnou plochou, môžeme prísť k vyššie uvedenému Girardov vzorec.

Guľovým trojuholníkom sa rozumie trojuholník na povrchu gule, zložený z oblúkov veľkých kružníc - teda takých kružníc, ktorých stred je stredom gule. Uhly guľového trojuholníka sú uhly medzi dotyčnicami k jeho stranám nakresleným v jeho vrcholoch. Rovnako ako uhly pravidelného trojuholníka sa pohybujú od 0 do 180°. Na rozdiel od plochého trojuholníka nemá guľový trojuholník súčet uhlov rovný 180°, ale viac: je ľahké to overiť, ak vezmeme do úvahy napríklad trojuholník tvorený oblúkmi dvoch poludníkov a rovníka na zemeguli. : hoci sa poludníky zbiehajú k pólu, oba sú kolmé na rovník, a preto má tento trojuholník dva pravé uhly!

Guľový trojuholník môže mať dva pravé uhly

Už indický Varahamihira (5.-6. stor.), arabskí matematici a astronómovia od 9. stor. (Sabit ibn Korra, al-Battani) a medzi západnými matematikmi, počnúc od Regiomontana (XV. storočie), existuje úžasná veta o sférických trojuholníkoch v rôznych formuláciách. Tu je návod, ako to možno formulovať v modernej notácii:

cosa = cosbcosc + sinbsinccosA. Sférická kosínusová veta je veľmi dôležitá pre astronómiu aj geografiu. Táto veta umožňuje pomocou súradníc dvoch miest A a B nájsť vzdialenosť medzi nimi. Sférická kosínusová veta navyše pomohla matematikom v islamských krajinách vyriešiť ďalší praktický problém: v meste s danými súradnicami nájsť smer k svätému mestu Mekka (každý ortodoxný moslim sa musí modliť päťkrát denne smerom k Mekke) . Pri riešení tohto problému, vzhľadom na mesto B ako Mekku, bolo potrebné nájsť uhol A toho istého trojuholníka.

Stránka zo „Zbierky pravidiel pre vedu o astronómii“, 11. storočie, autor neznámy.

V astronómii vám sférický kosínusový teorém umožňuje prechádzať z jedného súradnicového systému na nebeskej sfére do druhého. Najčastejšie sa používajú tri takéto systémy: v jednom slúži nebeský rovník ako rovník a póly sveta slúžia ako póly, okolo ktorých dochádza k viditeľnej dennej rotácii svietidiel; na druhej strane je rovník ekliptika - kruh, po ktorom sa počas roka uskutočňuje viditeľný pohyb Slnka na pozadí hviezd; v treťom zohráva úlohu rovníka horizont a úlohu pólov zohráva zenit a nadir. Najmä vďaka sférickej kosínusovej vete je možné vypočítať výšku Slnka nad obzorom v rôznych časoch a v rôznych dňoch v roku.

Plachty v architektúre sú sférickým trojuholníkom, ktorý poskytuje prechod zo štvorcového kupolového priestoru na obvod kupole. Plachta, pandatív (z francúzštiny pendentif) - časť klenby, prvok kupolovej konštrukcie, cez ktorý sa uskutočňuje prechod z obdĺžnikovej základne na strop kupole alebo jej bubon. Plachta má tvar guľového trojuholníka s vrcholom dole a vypĺňa priestor medzi pružinovými oblúkmi spájajúcimi susedné stĺpy klenutého štvorca. Základy guľových trojuholníkov plachiet spolu tvoria kruh a rozkladajú zaťaženie kupoly po obvode oblúkov.

Kupola na plachtách maľovanie plachiet

George Nelson

"Návrhár sa môže uvoľniť a zabaviť sa; výsledkom môže byť vtip, zábava. Je úžasné, ako často je to veľmi významná zábava." George Nelson

George Nelson je americký dizajnér, architekt, kritik a teoretik dizajnu. (1908, Hartford, Connecticut – 1986, New York)

Navrhoval svietidlá, hodiny, nábytok, obaly, zaoberal sa výstavným dizajnom.

Najznámejšími dizajnérskymi projektmi Georga Nelsona sú majstrovská štylizácia geometrických tvarov v duchu op artu či geometrického abstrakcionizmu.

Dizajnér stavia tvar svojej slávnej čiernej stoličky na základe guľového trojuholníka, ktorý bol široko používaný v architektonických štruktúrach kupolovitých štruktúr. Najmä v byzantských a ruských kostoloch sa takýto sférický trojuholník nazýval „plachta“. Vďaka „plachte“ sa uskutočnil hladký prechod z podpery kupoly k kupole.

George Nelson (George Harold Nelson, 1908-1986)

Escherova rytina

Sústredné gule 1935. Koncová rytina 24 x 24 cm.

Štyri duté sústredné gule sú osvetlené centrálnym zdrojom svetla. Každá guľa pozostáva z mriežky tvorenej deviatimi veľkými pretínajúcimi sa prstencami; rozdeľujú guľovú plochu na 48 podobných guľových trojuholníkov. Maurits Cornelis Escher (holand. Maurits Cornelis 17. 6. 1898, Leeuwarden, Holandsko – 27. 3. 1972, Laren, Holandsko) – holandský grafik.

Aplikácia sférického trojuholníka:

  1. Použitie sférických trojuholníkov v 3D grafike
  2. V astronómii
  3. V geografii. Veta o sférickom trojuholníku vám umožňuje použiť súradnice dvoch miest A a B na nájdenie vzdialenosti medzi nimi.
  4. V architektúre
  5. Dizajn stoličky od Georgea Nelsona
  6. V gravírovaní

Sférická trigonometria

guľové trojuholníky. Na povrchu lopty sa najkratšia vzdialenosť medzi dvoma bodmi meria pozdĺž obvodu veľkého kruhu, teda kruhu, ktorého rovina prechádza stredom lopty. Vrcholy guľového trojuholníka sú priesečníky troch lúčov vychádzajúcich zo stredu gule a guľového povrchu. strany a, b, c guľového trojuholníka sú tie uhly medzi lúčmi, ktoré sú menšie (ak je jeden z týchto uhlov rovnaký, potom sa guľový trojuholník zvrhne na polkruh veľkého kruhu). Každá strana trojuholníka zodpovedá oblúku veľkého kruhu na povrchu lopty (pozri obrázok).

rohy A, B, C guľový trojuholník protiľahlé strany a, b, c sú podľa definície menšie ako uhly medzi oblúkmi veľkých kružníc zodpovedajúcich stranám trojuholníka alebo uhly medzi rovinami vymedzenými týmito lúčmi.

Sférická trigonometria sa zaoberá štúdiom vzťahu medzi stranami a uhlami guľových trojuholníkov (napríklad na povrchu Zeme a na nebeskej sfére). Fyzici a inžinieri však v mnohých problémoch radšej používajú rotačné transformácie ako sférickú trigonometriu.

Vlastnosti sférických trojuholníkov. Každá strana a uhol guľového trojuholníka je podľa definície menšia ako .

Geometria na povrchu lopty je neeuklidovská; v každom guľovom trojuholníku je súčet strán medzi 0 a , súčet uhlov je medzi a . V každom guľovom trojuholníku leží väčší uhol oproti väčšej strane. Súčet ľubovoľných dvoch strán je väčší ako tretia strana, súčet ľubovoľných dvoch uhlov je menší ako plus tretí uhol.

Sférický trojuholník a základné vzorce sférickej trigonometrie

Mnoho problémov astronómie súvisiacich so zdanlivými polohami a pohybmi nebeských telies sa redukuje na riešenie sférických trojuholníkov.

Guľový trojuholník je obrazec ABC na povrchu gule, tvorený oblúkmi troch veľkých kruhov (obr. 15).

Uhly sférického trojuholníka sú dihedrálne uhly medzi rovinami veľkých kružníc, ktoré tvoria strany sférického trojuholníka. Tieto uhly sú merané plochými uhlami vo vrcholoch trojuholníka medzi dotyčnicami k jeho stranám.

Zvyčajne sa uvažujú trojuholníky, ktorých uhly a strany sú menšie ako 180°. Pre takéto sférické trojuholníky je súčet uhlov vždy väčší ako 180°, ale menší ako 540°, a súčet strán je vždy menší ako 360°. Rozdiel medzi súčtom troch uhlov guľového trojuholníka a 180° sa nazýva sférický prebytok σ, t.j.

σ = DA + DB + DC - 180°.

Plocha sférického trojuholníka s je

Kde R je polomer gule, na ktorej povrchu je vytvorený trojuholník.

Sférický trojuholník sa teda svojimi vlastnosťami líši od plochého a nie je možné naň aplikovať trigonometrické vzorce v rovine.

Zoberme si sférický trojuholník ABC (obr. 15), vytvorený na gule s polomerom R a so stredom v bode O.

Z vrcholu A ťaháme dotyčnice AD ​​a AE do strán b a c, až kým sa nepretnú s predĺženiami polomerov OS a 0B, ktoré ležia v rovnakej rovine s príslušnou dotyčnicou. Spojením priamych priesečníkov D a E získame dva ploché šikmé trojuholníky ADE a ODE so spoločnou stranou DE. Aplikovaním teorémov o elementárnej geometrii na tieto trojuholníky píšeme:

DE 2 \u003d OD 2 + OE 2 - 2OD × OE × cos a,

DE 2 \u003d AD 2 + AE 2 – 2AD × AE × cos A.

Odčítaním druhej rovnice od prvej dostaneme:

2OD × OE × cos a \u003d OD 2 - AD 2 + OE 2 - AE 2 + 2AD × AE × cos A. (1.31)

Z pravouhlých plochých trojuholníkov OAE a OAD vyplýva:

OD2-AD2=R2;OE2-AE2=R2;

AD = Rtgb; AE = Rtgs;

Dosadením týchto vzťahov do vzorca (1.31) a vykonaním zodpovedajúcich redukcií a prevodov dostaneme

cos a \u003d cos b cos c + sin b sin c cos A, (1,32)

tie. kosínus strany guľového trojuholníka sa rovná súčinu kosínusov jeho ďalších dvoch strán plus súčinu sínusov tých istých strán a kosínusu uhla medzi nimi.

Vzorec (1.32) možno napísať pre ktorúkoľvek stranu trojuholníka. Napíšme to napríklad pre stranu b:

cos b = cos s cos a + sin s sin a cos B

a dosadením cos a zo vzorca (1.32) dostaneme

cos b = cos c (cos b cos c + sin b sin c cos A) + sin c sin a cos B.

Rozbalením zátvoriek a posunutím prvého výrazu pravej strany doľava získame:

cos b (1 - cos 2 s) \u003d sin b sin s cos s cos A + sin c sin a cos B.

Nahradením (1 - cos 2 s) sin 2 s a znížením všetkého o sin c, nakoniec dostaneme

sin a cos B \u003d sinc cos b - cos c sin b cos A, (1,33)

tie. súčin sínusu strany a kosínusu zahrnutého uhla sa rovná súčinu sínusu druhej strany ohraničujúcej uzavretý uhol s kosínusom tretej strany mínus súčin kosínusu strany ohraničujúcej zahrnuté uhol o sínus tretej strany a kosínus uhla oproti prvej strane.

Vzorec (1.33) sa nazýva vzorec piatich prvkov. Analogicky sa dá napísať pre súčin sin a cos C, sin b cos A, sin b cos C, sin s cos A a sin s cos B.

Teraz riešime rovnosť (1.32) vzhľadom na cos A:

Odmocniním oboch strán poslednej rovnosti a ich odčítaním od 1 dostaneme:

Otvorením zátvoriek a vydelením oboch častí tohto výrazu hriechom 2 a dostaneme

Výsledný výraz je dokonale symetrický vzhľadom na a, b a c a nahradením A za B a b alebo A za C a a za c, píšeme

tie. sínusy strán guľového trojuholníka sú úmerné sínusom ich opačných uhlov; alebo pomer sínusu strany guľového trojuholníka k sínusu opačného uhla je konštanta.

Tri odvodené vzťahy (1.32), (1.33), (1.34) medzi stranami a uhlami guľového trojuholníka sú hlavné; možno z nich odvodiť mnoho ďalších vzorcov sférickej trigonometrie. Obmedzíme sa na odvodenie iba jedného vzorca pre pravouhlý sférický trojuholník. Nech A = 90°; potom sin A \u003d 1, cos A \u003d 0 a zo vzorca (1.33) dostaneme

sin a cos B \u003d sin s cos b.

Vydelením oboch častí tejto rovnosti hriechom b a dosadením podľa (1.34) dostaneme:

ctg B = hriech c ctg b

tie. pomer dotyčnice jedného ramena pravouhlého guľového trojuholníka k dotyčnici opačného uhla sa rovná sínusu druhého ramena.

Na reprezentáciu informácií o obrázku na Gaussovej guli v počítači má zmysel rozdeliť jej povrch na bunky.

V tomto prípade je plocha tej časti pôvodného povrchu, ktorá je orientovaná vo vnútri kužeľa smerov určených bunkou rozdelenia, spojená s každou bunkou. Takáto diskrétna aproximácia rozšíreného sférického obrazu sa nazýva orientačný histogram. V ideálnom prípade by bunky mali spĺňať nasledujúce požiadavky:

Mať rovnakú oblasť;

Buďte rovnakého tvaru

Buďte pravidelne rozmiestnení;

Majú zaoblený tvar;

Rozdelenie by malo poskytovať dostatočne dobré uhlové rozlíšenie;

Musia existovať rotácie, ktoré berú oddiel do seba.

Predĺžené bunky musia byť vylúčené, pretože budú zodpovedať informáciám o povrchových plochách, ktorých orientácia sa mení viac ako v prípade zaoblenejších buniek rovnakej oblasti. Súčasne, ak sú bunky usporiadané pravidelne, ich umiestnenie vo vzťahu k susedom bude pre všetky bunky rovnaké a takéto konfigurácie sú veľmi žiaduce. Bohužiaľ nie je možné splniť všetky tieto požiadavky súčasne.

Jednu z možných priečok tvoria šírkové pásy, z ktorých každý je potom rozdelený poludníkovými pruhmi (obr. 16.13). Výsledné bunky môžu mať takmer rovnakú plochu, ak sa počet takýchto pásov vo vysokých zemepisných šírkach zníži. Jednou z výhod takejto schémy je jednoduchosť nájdenia bunky, ktorej je potrebné priradiť určitú normálu k povrchu. Takáto metóda je však príliš vzdialená od splnenia vyššie uvedených požiadaviek. Neexistujú napríklad žiadne rotácie, pomocou ktorých sa zostrojená priečka gule prenesie do seba (okrem rotácií okolo osi spájajúcej póly).

Vhodnejšie priečky možno získať premietnutím pravidelných mnohostenov na jednotkovú guľu, ktorých stredy sa zhodujú so stredom gule. Plochy pravidelného mnohostenu sú pravidelné mnohouholníky (a všetky sú rovnaké). Preto má priečka získaná premietnutím pravidelného mnohostenu tú vlastnosť, že všetky bunky majú rovnaký tvar a plochu. Okrem toho je geometrické usporiadanie všetkých buniek vzhľadom na ich susedov rovnaké. bohužiaľ,

Ryža. 16.13. Rozdelenie gule na prvky poludníkmi a rovnobežkami. Žiaľ, takáto partícia má len niekoľko vlastností potrebných na uloženie orientačného histogramu.

Ryža. 16.14. (pozri skenovanie) Premietanie dvanásťstenu a dvadsaťstenu na jedinú guľu, aby sa získala priečka medzi bunkami a bunkami.

je známych len päť pravidelných telies, z ktorých si treba vybrať (štvorsten, šesťsten, osemsten, dvanásťsten a dvadsaťsten). Pre dodekaedrón sú bunky dosť zaoblené (obr. 16.14, a). Dvanásťsten má však len dvanásť tvárí. Dokonca aj dvadsaťsten poskytuje veľmi hrubé znázornenie orientácie (obrázok 16.14b). Navyše, dvadsať jeho buniek nie je veľmi zaoblených.

Môžeme ísť ďalej a zvážiť polopravidelné mnohosteny. Ich tváre sú tiež pravidelné mnohouholníky, ale nie nevyhnutne rovnaké. Plochy všetkých tvárí nie sú rovnaké. V niektorých prípadoch je možné skonštruovať nový mnohosten, ktorý má rovnakú topológiu spojení medzi stenami ako pôvodný polopravidelný mnohosten, ale ktorého plochy plôch sú rovnaké. V čom

Ryža. 16.15. a - skrátený dvadsaťsten, čo je polopravidelný mnohosten s 32 plochami; b - penta až desaťsten, pozostávajúci zo 60 trojuholníkových plôch. Menšie priečky povrchu jednotkovej gule môžu byť založené na takýchto polopravidelných mnohostenoch.

Ryža. 16.16. Schopnosť budovať geodetické siete založené na ľubovoľnom z projekcií pravidelných alebo polopravidelných mnohostenov.

Každá tvár je rozdelená na trojuholníkové bunky. Tu zobrazená sieť je založená na dvadsaťstene a má 12 vrcholov, ktoré susedia s 5 bunkami. Šesť buniek sa zbieha v zostávajúcich vrcholoch.

tvar niektorých tvárí už nie je správny. Príklad oddielu založeného na polopravidelnom mnohostene dáva futbalovú loptu (obr. 16.15, a). Za počiatočný sa považuje skrátený dvadsaťsten, teda teleso s 12 päťuholníkovými a 20 šesťhrannými plochami. Žiaľ, existuje len 13 polopravidelných mnohostenov (päť skrátených pravidelných mnohostenov, kuboktaedrón, ikoziddekaedrón, zrezaná kocka, zrezaný ikozidodekaedrón, zrezaný kuboktaedrón, kosoštvorcový sten, skrátený ikoziddekaedrón a zrezaný ikozidodekaedrón). Nevedú k dostatočne malým priečkam pre naše účely.

Ak predsa len chceme získať jemnejšiu priečku, potom môžeme skúsiť tú existujúcu rozložiť na trojuholníkové prvky. Napríklad, ak rozdelíme každú z päťuholníkových plôch dvanásťstenu na päť rovnakých trojuholníkov, dostaneme päťuholník so 60 plochami (obr. 16.15, b). Ohm je duálny so skráteným dvadsaťstenom.

Pri postupe v rovnakom smere možno každý z výsledných trojuholníkov rozdeliť na štyri menšie trojuholníky, v úplnom súlade s kupolovitými štruktúrami dobre známymi v geodézii (obr. 16.16). Zmiernením niektorých z vyššie uvedených požiadaviek možno dosiahnuť vysoké rozlíšenie. V skutočnosti je lepšie použiť duálne konštrukcie, pretože ich steny sú prevažne (nepravidelné) šesťuholníky s 12 päťuholníkmi rozptýlenými medzi nimi (obr. 16.15, b). Týmto spôsobom môžu byť vytvorené ľubovoľne malé priečky.

Na použitie tohto prístupu je potrebné vedieť efektívne určiť prvok, ktorý zodpovedá danej normále k povrchu. V prípade oddielov získaných na základe pravidelných polytopov je ľahké vypočítať kosínusy uhlov medzi daným jednotkovým vektorom a vektormi zodpovedajúcimi stredom buniek. (Ten druhý zodpovedá vrcholom duálu

pravidelný mnohosten.) Potom sa daný vektor priradí bunke, ktorej stred je najbližšie. V prípade predelu podobnej geodetickej sieti je možné konať hierarchicky. Takáto priečka je založená na nejakom pravidelnom mnohostene. Bunka s najbližším stredom sa nachádza tak, ako je opísané vyššie. Potom určíme, do ktorého z trojuholníkov, ktoré ho rozdeľujú, patrí jednotkový normálový vektor. Tento proces pokračuje pre ďalšie štyri trojuholníky, ktoré rozdeľujú ten nájdený atď.. V praxi možno použiť metódy vyhľadávania v tabuľke, ktoré aj keď nie sú presné, sú veľmi rýchle.

Nech je priestorový uhol vyplnený jednou bunkou na guli (v prípade dvadsaťstenu). Očakávaný počet normál, ktoré spadajú do takejto bunky pre konvexný objekt, je

Je jasné, že orientačný histogram, t. j. diskrétnu aproximáciu rozšíreného sférického obrazu, je možné vypočítať lokálne. Jednoducho spočítame počet normál, ktoré patria do každej bunky. Zároveň je Gaussova krivosť vyjadrená pomocou prvej a druhej parciálnej derivácie funkcie definujúcej povrch. V praxi sa odhady týchto derivátov ukážu ako nespoľahlivé kvôli prítomnosti šumu. Preto je veľmi dôležitá skutočnosť, že rozšírený sférický obraz možno vypočítať bez výpočtu derivácií.

Príbeh tohto dema je nasledovný: raz môj priateľ vyrobil generátor máp planét pre svoju hru a chcel, aby sa takto vytvorené mapy zobrazovali ako rotujúca guľa. Zároveň však nechcel použiť 3D grafiku, ale namiesto toho vygeneroval veľa snímok s rovnakou guľou otočenou v rôznych uhloch. Množstvo použitej pamäte bolo ... povedzme nadmerné, ale rýchlosť generovania rámcov (ako aj kvalita ich vykonávania) značne utrpela. Po krátkom premýšľaní sa mi podarilo pomôcť mu tento proces optimalizovať, no vo všeobecnosti som mal dobrý pocit, že toto je úloha pre OpenGL a už vôbec nie pre 2D grafiku.

A tak som sa jedného dňa, keď ma trápila nespavosť, rozhodol, že skúsim skombinovať tieto dva prístupy: nakresliť rotujúcu guľu (s natiahnutou mapou planét) cez OpenGL, no zároveň ju nechať rovnú.

A musím povedať, že sa mi to podarilo. Ale najprv to.

Procesná matematika

Na začiatok si definujme skutočnú úlohu. Pre každý bod na obrazovke máme dve súradnice obrazovky v karteziánskom súradnicovom systéme a musíme preň nájsť sférické súradnice (v skutočnosti zemepisnú šírku a dĺžku), čo sú v skutočnosti súradnice textúry pre mapu planéty.

Takže Prechod zo sférického súradnicového systému do karteziánskeho je daný sústavou rovníc (prevzaté z Wikipédie):

A spätný prechod - s takými rovnicami:

Koordinovať Z môžeme sa ľahko dostať von X a Y, pričom poznáme polomer, a samotný polomer môžeme považovať za rovný jednej.
V budúcnosti sa dohodneme, že vyššie uvedené rovnice mierne pozmeníme zámenou pojmov Y(pre nás to bude obrazovka vertikálna) a Z(toto bude hĺbka scény).

Technická časť

Implementácia nápadu si bude vyžadovať použitie štvorkolky (už hovorím o tom, ako ju používať, takže to nebudem opakovať, najmä preto, že nižšie je odkaz na úplný zdrojový kód projektu), ako aj dve textúry: aktuálna mapa planéty (použil som textúru Zeme 2048x1024) a mapy súradníc textúr. Kód na generovanie druhej textúry úhľadne opakuje matematiku prevodu z karteziánskych na sférické súradnice:

int texSize = 1024; double r = texSize * 0,5; int pixelov = new int; for (int riadok = 0, idx = 0; riadok< texSize; row++) { double y = (r - row) / r; double sin_theta = Math.sqrt(1 - y*y); double theta = Math.acos(y); long v = Math.round(255 * theta / Math.PI); for (int col = 0; col < texSize; col++) { double x = (r - col) / r; long u = 0, a = 0; if (x >= -sin_theta && x<= sin_theta) { double z = Math.sqrt(1 - y*y - x*x); double phi = Math.atan2(z, x); u = Math.round(255 * phi / (2 * Math.PI)); a = Math.round(255 * z); } pixels = (int) ((a << 24) + (v << 8) + u); } } GLES20.glGenTextures(1, genbuf, 0); offsetTex = genbuf; if (offsetTex != 0) { GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, offsetTex); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_NONE); GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_NONE); GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, texSize, texSize, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels)); }
Všimnite si, že súradnice X a Y sa prenesú z rozsahu do rozsahu [-1..1] a súradnice textúry U a V sa prevedú z radiánov na rozsah , po ktorom sa zapíšu do červenej a zelenej zložky 32-bitovej textúry. Alfa kanál sa používa na uloženie "hĺbky" (súradníc Z), zatiaľ čo modrá zostáva zatiaľ nevyužitá. Vypnutie bilineárneho filtrovania tiež nie je náhodné: v tejto fáze to nemá žiadny účinok (susedné body majú v každom prípade rovnaké hodnoty, s dosť ostrými skokmi) a v tom, čo ukážem ďalej, bude škodlivé. Ale o tom viac nižšie.

Obidve textúry sa privádzajú na vstup jednoduchého pixel shadera (ďalej na obrázky sa dá kliknúť):

Súkromné ​​finále String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "varying vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy).rgb;\n" + " gl_FragColor = vec4(vCol, (vTex.w >
Neposkytujem kód vykresľovania scény, pretože všetko je v ňom dosť triviálne (a opäť to môžete vidieť v úplnom zdroji) a samotný shader je dosť primitívny. Najzaujímavejšie na tom možno je, že alfa kanál je zatiaľ kontrolovaný len na pozitivitu, zatiaľ čo by sa dal použiť na svetelný efekt.

Dopadlo to celkom dobre, ale akosi naplocho, plus by som k tomu pridal skutočnú rotáciu planéty okolo svojej osi.

Do shadera zahrnieme ešte jeden parameter (zmeníme ho v závislosti od času v rozsahu), plus pridáme „hĺbku“ (vynásobenie farby hodnotou z alfa kanála):

Súkromné ​​finále String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "varying vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vTex.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vTex.xy ).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0,0 ? 1,0: 0,0));\n" + ")\n";
Na samotnú guľu nie sú žiadne sťažnosti, ale obraz vyzerá nejako ... osembitový alebo tak niečo. A niet sa čomu čudovať: súradnice textúry sme zaznamenali v rozsahu (maximálne dostupné v bežných farebných zložkách), čo znamená, že naša textúra nemôže mať viac ako 256 bodov na výšku (a 512 na šírku, ak vezmeme do úvahy rotáciu). Nestačí, potrebujete aspoň 10-bitovú presnosť.

Zvýšenie rozlíšenia

Okamžite vás varujem: tu popísaný kód môže na akomkoľvek zariadení fungovať nesprávne, aj keď sa mi podarilo dosiahnuť normálne vykresľovanie na všetkých zariadeniach, ktoré som mohol držať v rukách. V každom prípade to, čo je tu popísané, je bežný hack.

Z troch farebných zložiek sme teda zatiaľ použili dve, t.j. 16 bitov z 24. No zabaľme dáta tak, aby každá súradnica textúry mala veľkosť 12 bitov, čo nám umožní pracovať s textúrami do výšky 4096 pixelov! Aby sme to dosiahli, zmeníme v programe doslova tri riadky:

Long v = Math.round(4095 * theta / Math.PI); ...u = Math.round(4095 * phi / (2 * Math.PI)); ... pixelov = (int) ((a<< 24) + (v << 12) + ((u & 15) << 8) + (u >> 4)); ...
a napíšte nový shader, ktorý zohľadňuje 12-bitovú schému adresovania (toto je miesto, kde musí byť vypnuté bilineárne filtrovanie!):

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "varying vec4 TexCoord0;\n" + "void main() (\n" + " vec4 vTex = texture2D(uTexture0, TexCoord0.xy);\n" + " vec3 vOff = vTex.xyz * 255,0 + vec3(0,5, 0,5, 0,5);\n" + " float hiY = floor(vOff.y / 16.0);\n" + " float loY = vOff.y - 16.0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16.0 + loY) / 4095,0 + uOffset,\n" + " (vOff.z * 16,0 + hiY) / 4095,0);\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * vTex.w, (vTex.w > 0,0 ? 1,0: 0,0));\n" + ")\n";
No toto je úplne iná vec! S menšími úpravami (pridanie pinch zoom a rotácia prstov) som tento program ukázal svojim priateľom a kolegom a zároveň som sa spýtal, koľko trojuholníkov je podľa nich v tejto scéne. Výsledky sa rôznili a už samotná otázka vzbudzovala podozrenie na prítomnosť úlovku (v tomto prípade respondenti žartovali „jeden“, čo nebolo ďaleko od pravdy), no správna odpoveď neustále prekvapovala. A každý sa ako jeden spýtal: prečo sa dá guľa otáčať okolo jednej osi, ale nie nakláňať? .. Hmm.

Sklon

Faktom však je, že svah v tejto schéme je oveľa ťažšie realizovať. V skutočnosti táto úloha nie je neriešiteľná a dokonca som sa s ňou vyrovnal, ale nie bez nuancií.

V podstate ide o úlohu zobrať posunuté súradnice V, zatiaľ čo súradnica U nemení: je to preto, že pridávame rotáciu okolo osi X. Plán je nasledovný: transformujeme súradnice textúry na súradnice obrazovky (v rozsahu [-1..1]), aplikujeme na ne rotačnú maticu okolo horizontálnej osi (na to vopred zapíšeme novú konštantu uNaklonenie sínus a kosínus uhla sklonu) a potom použijeme novú súradnicu Y na vzorku textúry našej šablóny. "Otočená" súradnica Z príde vhod aj nám, s jeho pomocou zrkadlíme zemepisnú dĺžku pre zadnú stranu lopty). Súradnica obrazovky Z budete musieť explicitne počítať, aby ste z jednej textúry nerobili dva výbery textúr, zároveň sa tým zvýši jej presnosť.

private final String quadFS = "precision mediump float;\n" + "uniform sampler2D uTexture0;\n" + "uniform sampler2D uTexture1;\n" + "uniform float uOffset;\n" + "uniform vec2 uTilt;\n" + "varying vec4 TexCoord0;\n" + "void main() (\n" + " float sx = 2,0 * TexCoord0.x - 1,0;\n" + " float sy = 2,0 * TexCoord0.y - 1,0;\n" + " float z2 = 1,0 - sx * sx - sy * sy;\n" + " if (z2 > 0,0) (;\n" + " float sz = sqrt(z2);\n" + " float y = ( sy * uTilt.y - sz * uTilt.x + 1,0) * 0,5;\n" + " float z = (sy * uTilt.x + sz * uTilt.y);\n" + " vec4 vTex = texture2D(uTexture0 , vec2(TexCoord0.x, y));\n" + " vec3 vOff = vTex.xyz * 255,0 + vec3(0,5, 0,5, 0,5);\n" + " float hiY = podlaha (vOff.y / 16,0) ;\n" + " float loY = vOff.y - 16,0 * hiY;\n" + " vec2 vCoord = vec2(\n" + " (vOff.x * 16,0 + loY) / 4095,0,\n" + " ( vOff.z * 16,0 + hiY) / 4095,0);\n" + " if (z< 0.0) { vCoord.x = 1.0 - vCoord.x; }\n" + " vCoord.x += uOffset;\n" + " vec3 vCol = texture2D(uTexture1, vCoord).rgb;\n" + " gl_FragColor = vec4(vCol * sz, 1.0);\n" + " } else {\n" + " gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n" + " }\n" + "}\n";
Hurá, svah sa vydaril! To je len zvláštny hluk na hranici hemisfér trochu trápny. Problém je samozrejme v nedostatočnej presnosti adresovania v hraničných bodoch (body na kružnici zodpovedajú príliš veľkému rozsahu súradníc, jeden texel sa rozprestiera na intervale značnej dĺžky). Nakoniec sa mi to podarilo poraziť použitím dvoch vygenerovaných textúr namiesto jednej.

V dôsledku toho môžete približovať a otáčať loptičku takmer rovnakým spôsobom ako v aplikácii Google Earth. S tým rozdielom, že sú to len dva trojuholníky.

A nakoniec sľub. Zdrojový kód projektu je dostupný na adrese