Kulové plochy, hlavní kružnice a rovnoběžky - HAL

Transkript

Kulové plochy, hlavní kružnice a rovnoběžky - HAL
Kulové plochy, hlavnı́ kružnice a rovnoběžky
Denis Roegel
To cite this version:
Denis Roegel. Kulové plochy, hlavnı́ kružnice a rovnoběžky. Zpravodaj (Československého
sdruženı́ uživatelů TeXu, ISSN 1211-6661), Groupe des utilisateurs de TeX tchèques, 2010, 20
(1-2), pp.23-38. <inria-00548908>
HAL Id: inria-00548908
https://hal.inria.fr/inria-00548908
Submitted on 27 Dec 2010
HAL is a multi-disciplinary open access
archive for the deposit and dissemination of scientific research documents, whether they are published or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.
L’archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d’enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.
Kulové plochy, hlavní kružnice a rovnoběžky
Denis Roegel
Abstrakt
Každá oblast lidského zkoumání má své grafické reprezentanty. Například kulové plochy, v běžné řeči se taktéž používá pojem (nebeská) sféra a nešťastně
volený termín koule, jsou neodlučitelnými grafickými elementy oblastí jako je
geografie nebo astronomie. Při studiu řady publikací jsme se setkávali s kulovými
plochami vykreslenými nepřesně, především z pohledu dílčích částí, jako jsou
hlavní kružnice a rovnoběžky. Článek představuje několik jednoduchých technik
v METAPOSTu, které tyto zjištěné geometrické problémy jednoznačně řeší.
Klíčová slova: METAPOST, deskriptivní geometrie, rovnoběžné promítání,
kulové plochy, sféry, rovník, ekliptika, oběžná dráha Měsíce, hlavní kružnice,
rovnoběžky, elipsy, zobrazení Země.
doi: 10.5300/2010-1-2/23
Úvod
Sféry a jejich části (hlavní kružnice,1 poledníky a rovnoběžky) představují typické nákresy v oblastech, jako je geografie nebo astronomie. Uveďme si příklad.
Pokud si chceme nakreslit pohyb Slunce na obloze, často se nákres přikloní ke
sféře se světovým rovníkem a ekliptikou (tedy přibližnou dráhou Slunce na této
sféře). V řadě oborů jsou sféry vykreslovány pomocí projekce, jako v kartografii,
nákresech slunečních hodin (základem je gnómon, tj. ukazatel slunečních hodin
kolmý na rovinu číselníku) i jinde. Nákresy sfér v publikacích jsou samy o sobě
projekce.
Vyzkoušíme si ten nejjednodušší případ, ve kterém budou sféry zobrazeny
v rovnoběžném promítání do roviny (průmětny). To je taková situace, kdy je
promítnutí realizováno rovnoběžkami. Budeme také kvůli zjednodušení předpokládat, že průmětna je kolmá ke směru projekce, ačkoliv některé naše závěry
budou nezávislé na tomto zavedeném předpokladu.
* The
English article is a translation of “Sphères, grands cercles et parallèles,” Les Cahiers
GUTenberg, Number 48, April 2007, pages 7–22. This is a translation of the article “Spheres, great
circles and parallels,” which appeared in TUGboat, Volume 30 (1), pp. 80–87, 2009. Reprinted
with permission. Translation by Pavel Stříž. Corrections by Petr Aubrecht and Michal Mádr.
1 Hlavní kružnice vzniká jako průnik kulové plochy a roviny procházející středem této
kulové plochy. Vedlejší kružnice vznikne tak, že rovina kdekoliv prochází kruhovou plochou, ale
neprochází jejím středem.
23
Konkrétněji si prozraďme, že se budeme snažit o vykreslení sféry s rovníkem,
poledníky a dalšími hlavními kružnicemi, navíc s rovnoběžkami, všechny v případě
nutnosti vykresleny také přerušovanými čarami a správně z pohledu rovnoběžného
promítání známého z deskriptivní geometrie.
Abychom si dobře představili možné problémy naší úlohy, bude vhodné se
seznámit s obecnými principy často používaných způsobů promítnutí.
Promítání
Základní způsoby promítání nám ukazuje obr. 1. Jedná se o promítnutí rovníku
(reprezentován dvěma krajními body), severního pólu a jednoho ze dvou bodů,
jejichž promítaná přímka je tangentou sféry.
Obrázek 1: Promítání rovnoběžné (levá část), axonometrické (střední část) a perspektivní (pravá část) do vertikální roviny.
Náhled do literatury kolem promítnutých sfér
Pročítání publikovaných podkladů, ať už na papíře nebo na internetu, je zdrojem
nejednoho překvapení. Za předpokladů, že je realizováno promítání do roviny,
a buď aplikováno jedno z rovnoběžných promítání nebo promítání perspektivní,
dva z naprosto přirozených předpokladů, se i přesto zdá, že většina podkladů,
která se nám dostala do rukou, vykresluje sféry dosti neočekávaně.
Všechny problémy se objevují právě tehdy, když obrázek nebyl nakreslen
promítáním. Nehledě na fakt, že řada obrázků nevykresluje promítané kružnice
jako elipsy, jsou největším problémem u tištěných obrázků pozice klíčových bodů,
především pólů. Nahlédneme-li na promítnutí na obr. 1, zjistíme, že když je rovník
24
vyobrazen jako elipsa, neměly by být póly vyobrazeny na obvodu promítané sféry.
To je bohužel situace, kterou lze v tištěných podkladech mnohokrát objevit.
Abychom naše tvrzení potvrdili, dovolíme si předložit seznam několika knih,
kde je právě zobrazení kulové plochy problematické, navíc s číslem strany knihy,
aby se čtenář mohl sám přesvědčit.
• William M. Smart: Celestial Mechanics. New York: Longmans, Green, 1953,
strana 24.
• Derek J. Price: The Equatorie of the Planetis. Cambridge: the University
press, 1955, strana 96.
• John D. North: Richard of Wallingford. Oxford: Clarendon Press, 1976,
ročník 3, strana 152.
• René R. J. Rohr: Sundials: History, Theory, and Practice. New York: Dover
publications, 1996, strana 25. ISBN 978-0486291390.
• Gianni Pascoli: Éléments de mécanique céleste. 2. vydání. Paříž: Masson,
1997, strana 12. ISBN 978-2225831157.
• Raymond d’Hollander: L’astrolabe : histoire, théorie et pratique. 1. vydání.
Paříž: Institut océanographique, 1999, strana 26. ISBN 2903581193.
• Denis Savoie: La gnomonique, Paříž: Les Belles lettres, 2001, strana 44.
• Denis Savoie: Cosmographie, Paříž: Belin-Pour la science, 2006, strana 17.
Jak již bylo řečeno, některé knihy si nedaly pozor na pozici pólů, to je především případ klasické knihy Otta Neugebauera A History of Ancient Mathematical
Astronomy, New York: Springer-Verlag, 1975, strana 1408. ISBN 3-540-06995-X.
Řada webových stránek také není v pořádku, za všechny zmiňme například
hvězdárnu Paris-Meudon (http://media4.obspm.fr/) nebo Institut de Mécanique Céleste et de Calcul des Éphémérides (http://www.imcce.fr/), jejichž
nákresy jsou nepřesně zrealizované.
Důvody, proč se tyto chyby neustále opakují, nám nejsou úplně jasné, skoro
to vypadá, že je to jistý druh zlozvyku, nějaký druh lenosti a – v některých
případech – bezmyšlenkovité přebírání a citování obrázků jiných autorů.
Řešení promítání pomocí METAPOSTu
Ačkoliv je naše situace poměrně jednoduchá, vypadá to, že tento druh nákresů
nebyl řešen METAPOSTem ani žádným TEXovým grafickým nástrojem, jako je
například PSTricks. Nádstavby druhého zmíněného systému již umí trojrozměrné
zobrazování objektů, ale nákresy skrytých částí jsou řešeny tak, že jsou tyto dříve
vykreslené části překreslovány další vrstvou a ke skutečnému propočtu skrytých
částí nedochází.
Jeden ze zdrojů problémů promítnutí sféry lze hledat u přerušovaných čar.
Ty se standardně používají k zobrazení neviditelných částí objektu z pohledu
25
pozorovatele. Proto je nutné zajistit přesné umístění začátků a konců těchto čar,
a to je úloha, která vyžaduje výpočet společných bodů křivek.
sever
sever
oběžná dráha Měsı́ce
ekliptika
ekliptika
L2
L1
S
Ω
rovnı́k
γ
S′
Ω
O
rovnı́k
O
γ
L3
Pe
jih
jih
Obrázek 2: Dva nákresy kulových ploch, které neodpovídají rovnoběžnému promítání do plochy. Póly jsou umístěny na obvodu kružnice, ačkoliv by měly být
umístěny mírně uvnitř kružnice pod úhlem, pod kterým je vidět rovina rovníku.
Takové obrázky si kreslíme během příprav k přednášce z astronomie, jak si
však můžeme všimnout, náš první pokus dělá ty samé chyby, kterých se dopustili
naši předchůdci, konkrétně umístění pólů je dle přirozeného lidského zjednodušení.
Obrázek 2 na str. 26 ukazuje tyto naše první pokusy, takové, které lze nalézt na
mnoha jiných místech.
Obrázek 3 představuje nákresy nebeských sfér, jak by správně měly vypadat.
Umístění pólů je zde spočteno přesně, ať už pólů ve vztahu k rovníku (N a S dle
anglického značení North pro sever a South pro jih), tak také ve směru ekliptiky
(N ∗ a S ∗ ). Taktéž je správně zobrazen úhel mezi rovinami rovníku a ekliptiky, tj.
23,5◦ . Naše ukázka kvůli čitelnosti záměrně navýšila sklon roviny oběžné dráhy
Měsíce vůči rovině rovníku.
V následujících kapitolách si ukážeme, jak jsme tyto správně vykreslené
obrázky získali, omezíme se však jen na rovnoběžné promítání. Nákresy budou
připraveny v METAPOSTu, ale nic nám nebrání v tom, abychom si algoritmy
zrealizovali v jiných programovacích jazycích.2
2 Úvodem
do METAPOSTu nechť nám poslouží celá řada manuálů na internetu nebo nahlédněme do dokumentace ve většině TEXových distribucí, případně do druhého vydání knihy
LATEX Graphics Companion [1].
26
N
N
N∗
oběžná dráha Měsı́ce
ekliptika
L2
ekliptika
L1
O
rovnı́k
Ω
S
rovnı́k
O
γ
L3
Ω
S′
γ
Pe
S∗
S
S
Obrázek 3: Dva správné nákresy roviny rovníku, ekliptiky, pólů a poledníku
rovníku a ekliptiky. Sklon oběžné dráhy Měsíce byl záměrně zvýrazněn.
Promítnutí kulové plochy
Rovnoběžným promítnutím kulové plochy dostáváme kružnici, jejiž průměr je ten
samý jako promítané kulové plochy. Kvůli zjednodušení budeme předpokládat, že
střed kružnice bude v počátku soustavy souřadnic.
r=5cm; draw fullcircle scaled 2r;
Definice vektorů
Aby se nám dobře a přesně zaznamenávalo promítání, tak si nejdříve nadefinujme
proměnnou typu vektor. Takovým typem proměnné však METAPOST nedisponuje,
můžeme se však inspirovat definováním barvy, která je složena ze tří numerických
27
složek, které si pod vektorem můžeme představit. Přístup k jednotlivým složkám
vektoru bude realizováno pomocí Xp, Yp a Zp. Po tomto kroku si můžeme připravit
základní operace s vektory, jako bude skalární součin (dotproduct), vektorový
součin (vecproduct) a vykreslení jednotkového vektoru.
let vector=color;
let Xp=redpart; let Yp=greenpart; let Zp=bluepart;
def dotproduct(expr Vi,Vj)=
(Xp(Vi)*Xp(Vj)+Yp(Vi)*Yp(Vj)+Zp(Vi)*Zp(Vj))
enddef;
def vecproduct(expr Vi,Vj)=
(Yp(Vi)*Zp(Vj)-Zp(Vi)*Yp(Vj),
Zp(Vi)*Xp(Vj)-Xp(Vi)*Zp(Vj),
Xp(Vi)*Yp(Vj)-Yp(Vi)*Xp(Vj))
enddef;
def norm(expr V)= sqrt(dotproduct(V,V)) enddef;
def normed(expr V)= (V/norm(V)) enddef;
Zanesení směru v prostoru
Než se pustíme do promítání, nastavíme si směr kulové plochy. Přesněji řečeno,
−
→ −
→ −
→
připravíme si tři vektory V1 , V2 , V3 užitím vektorů z ortonormální báze. Užijeme
jen dva úhly a tím si zajistíme vertikální charakter promítnutí jednoho z vektorů.
−
→
Úhel θ bude úhel rotace ~ı kolem ~k, čímž získáme V1 . Úhel φ bude úhel rotace
→
−
→
−
→
−
→
~k kolem −
V1 , čímž získáme V2 . Vektor V3 dostaneme vektorovým součinem V1
−
→
−
→
a V2 a orientace bude směrem k pozorovateli. Vektor V1 představuje vektor
−
→
roviny promítání natočený směrem doprava a V2 vektor natočený směrem nahoru.
Obrázky představené dále v tomto článku byly získány nastavením θ = 70
a φ = −15.
vector V[]; % Pole složek vektoru.
theta=70; phi=-15;
V1=(cosd theta,sind theta,0);
V2=(sind(phi)*sind(theta),-sind(phi)*cosd(theta),cosd(phi));
V3=vecproduct(V1,V2);
Promítnutí objektu
Promítání samo o sobě je už relativně snadné, bude nám k tomu stačit určit složky
−
→ −
→ −
→
vektoru v prostoru báze (V1 , V2 , V3 ), což je bleskurychlá záležitost skalárního
součinu. Nás v této chvíli budou zajímat jen první dvě složky báze, neboť vektor
−
→
V3 je rovnoběžný se směrem promítání. Funkce project nám poskytne přirozený
zápis promítání a s třetím vektorem báze nebudeme vůbec pracovat:
28
def project(expr V,Va,Vb)=
(dotproduct(V,Va),dotproduct(V,Vb))
enddef;
z0=(0,0);
z1=project((r,0,0),V1,V2);
z2=project((0,r,0),V1,V2);
z3=project((0,0,r),V1,V2);
drawarrow z0--z1; drawarrow z0--z2;
drawarrow z0--z3;
Sestrojení rovníku
V této chvíli jsme schopni nakreslit hlavní kružnice, jako je například rovník.
Rovnice rovníku je jednoduchá: je to množina všech bodů (r cos t, r sin t, 0), pro
všechna t, pro která platí 0 ≤ t < 360, kde parametr t je vyjádřen ve stupních.
Makro f_equ nám tuto parametrickou rovnici zjistí a kružnice bude získána
spojováním promítnutých bodů v pravidelném intervalu, zde to bude od desíti
stupňů s krokem deset stupňů.
def f_equ(expr r,t)=(r*cosd(t),r*sind(t),0) enddef;
path equator;
equator=
project(f_equ(r,0),V1,V2)
for t=10 step 10 until 350:
..project(f_equ(r,t),V1,V2)
endfor ..cycle;
draw equator withcolor black;
29
Zjednodušení sestrojení rovníku
Rovník byl nyní sestrojen jako křivka složená z velkého počtu bodů. Tato křivka
by ale měla být elipsa, kterou můžeme získat velmi dobře aproximací fullcircle.
(Jedná se však jen o aproximaci, neboť fullcircle není dokonalou kružnicí.)
Sestrojení elipsy z kružnice je zrealizováno následujícím způsobem, a to za
použití hlavní a vedlejší poloosy a úhlu natočení elipsy. Ke správnému vykreslení
je potřeba znát obě osy elipsy, které z dříve naznačeného postupu nejsou zatím
známé.
def ellipse(expr ra,rb,an)=
(fullcircle xscaled 2ra yscaled 2rb rotated an)
enddef;
draw ellipse(r,.5r,0);
30
Zjištění vlastností elipsy
Chceme-li zjistit vlastnosti elipsy (osy a úhel natočení), mohou být použity
parametry promítání, nebo můžeme tyto vlastnosti elipsy jednoduše změřit ze
sestrojených bodů. To se nám může podařit následujícím způsobem:
• zaprvé, kružnici navrstvíme na elipsu;
• poté jsou nalezeny čtyři společné body kružnice a elipsy (tento krok může
vyžadovat patřičné zvětšení kružnice);
• průsečíky nám poskytují dostatek informací k určení směru os elipsy;
• následně jsou osy změřeny;
• a na závěr je elipsa mnohem efektivněji sestrojena.
Nyní tento postup podrobněji prozkoumáme.
Sklon elipsy
Pokud chceme určit směr elipsy, můžeme využít makra ellipse_major_angle,
které zpracuje cestu p, která představuje hlavní poloosu elipsy a vystředěnou
do počátku. Jednoduchým rozpůlením se snažíme najít půlkružnici o poloměru
rc takovou, která má neprázdnou množinu společných bodů s elipsou. Poté
jsme schopni identifikovat průsečíky (pi1, pi2) za pomocí intersectionpoint
a pečlivým dělením půlkružnice. Díky symetrii nám tyto dva průsečíky poskytnou
zbylé dva průsečíky (pi3, pi4).
Sklon elipsy lze získat vypočtením dvou průsečíků pi5 a pi6. Jeden z průsečíků
leží na hlavní ose, druhý na vedlejší ose elipsy.
vardef ellipse_major_angle(expr p,a)=
save pa,pc,pi,ra,rb,rc,an;
path pc[]; pair pa,pi[]; ra=.5a; rb=a;
forever: %=== Rozdělení do dvou částí ===
rc:=.5[ra,rb];
pc0:=subpath(0,4) of fullcircle scaled 2rc;
31
pa:=pc0 intersectiontimes p;
exitif pa<>(-1,-1);ra:=rc;
endfor;
%======== Výpočet dvou průsečíků ========
pi1=p intersectiontimes pc0;
pc1=subpath(0,ypart(pi1)-0.01) of pc0;
pc2=subpath(ypart(pi1)+0.01,length(pc0)) of pc0;
pi1:=p intersectionpoint pc0;
pi2:=p intersectiontimes pc1;
if pi2=(-1,-1):
pi2:=p intersectionpoint pc2;
else:
pi2:=p intersectionpoint pc1;
fi;
pi3=pi1 rotated 180; % Další dva průsečíky.
pi4=pi2 rotated 180; % Třetí a čtvrtý.
%============== Sklon elipsy =============
pi5=p intersectionpoint (origin--(unitvector(pi2-pi1)*2a));
pi6=p intersectionpoint (origin--(unitvector(pi1-pi4)*2a));
if arclength(origin--pi5)>arclength(origin--pi6):
an=angle(pi1-pi2);
else:
an=angle(pi1-pi4);
fi;
an % Výstup makra.
enddef;
Vedlejší osa elipsy
Vstupem pro makro ellipse_minor_axis je cesta p, která představuje hlavní
poloosu elipsy a vystředěnou do počátku, jehož hlavní osa je natočena o úhel an.
Makro jednoduše zjišťuje průsečík křivky p a přímky umístěné v pravém úhlu od
hlavní osy a měří její vzdálenost od středu elipsy.
vardef ellipse_minor_axis(expr p,a,an)=
save pa; pair pa;
pa=p intersectionpoint (origin--(dir(an+90)*2a));
arclength(origin--pa) % Výsledek.
enddef;
Díky těmto dvěma makrům jsme schopni zjistit všechny klíčové parametry
elipsy k tomu, abychom dokázali využít úspornou variantu jejího vykreslení, tedy
bez nutnosti výpočtu mnoha desítek bodů.
32
Přerušovaná čára na rovníku
Přerušovaná čára na rovníku představuje polovinu elipsy a ony dvě poloviny se
spojí na průsečíku elipsy s hlavní osou. Proto nám stačí rozpůlit elipsu a jednu
polovinu nakreslit plnou čárou a tu druhou přerušovanou. Elipsa, která se nám
vrací z makra ellipse, je parametrická křivka, kde parametr nabývá hodnot od
0 do 8 (základní kružnice je složena z osmi bodů), 0 leží na hlavní ose a části od
0 do 4 a od 4 do 8 jsou od sebe odděleny.
path pa,pb,pc;
pa=ellipse(r,rb,0);
pb=subpath(0,4) of pa;
pc=subpath(4,8) of pa;
draw pb dashed evenly; % Skrytá část.
draw pc; % Viditelná část rovníku.
Hlavní kružnice
Ten samý způsob použijeme na konstrukci všech dalších hlavních kružnic. Jediným problémem je určit rovnici dané hlavní kružnice. Připravená makra jsou
parametrizována z toho důvodu, aby bylo možné určit, která část elipsy bude
vykreslena plnou čárou a která přerušovanou.
Určit některé hlavní kružnice lze na základě konkrétních omezení. Například
v následujícím nákresu jsme po výběru bodu L1 na ekliptice byli schopni vykreslit
příslušný poledník procházející L1 a zároveň jsme získali bod L2 na oběžné dráze
Měsíce. Tyto průsečíky byly získány jako společné body promítnutí, průsečík
v prostoru byl pak zpětně dopočítán na základě znalostí jednotlivých křivek.
Touto cestou jsme získali poledník vztažený k rovníku, neb byla vykreslena elipsa
procházející L2 a takto jsme mohli získat bod L3 .
33
N
N∗
oběžná dráha Měsı́ce
L2
ekliptika
L1
Ω
rovnı́k
O
L3
Ω
γ
S∗
S
Nastavení podmínek
Tyto doplňující podmínky můžeme snadno vzít v úvahu například použitím makra
rotatearound, které umí otočit jeden vektor kolem jiného.
% Makro otočí vektor Va kolem vektoru Vb o úhel ‘a’.
vardef rotatearound(expr Va,Vb,a)=
save v; vector v[];
v0=normed(Vb); v1=dotproduct(Va,v0)*v0;
v2=Va-v1; v3=vecproduct(v0,v2);
v4=v2*cosd(a)+v3*sind(a)+v1;
v4 % Výstup makra.
enddef;
Proto lze například u křivky představující ekliptiku zapsat rovnici jako funkci:
def f_ecliptic(expr t)=
(a*(cosd(t),sind(t)*cosd(ec_angle),sind(t)*sind(ec_angle)))
enddef;
kde ec_angle je sklon roviny ekliptiky (23,5◦ ). Nyní můžeme zahájit výpočet
severního pólu ekliptiky (N ∗ ) za předpokladu γ = (1, 0, 0) takto:
vector North,North_Ec; North=a*(0,0,1);
North_Ec=rotatearound(North,(1,0,0),ec_angle);
Poněvadž bod L1 je zvolen na ekliptice, poledník procházející L1 a N ∗ je
−−−→ −−→
vypočten dvěma vektory ON ∗ a OL1 , kdy každý bod poledníku je získán rotací
−−→
−−→ −−−→
OL1 kolem vektoru ortogonálního k OL1 a ON ∗ .
Následující makro f_ec_meridian, parametrizováno bodem A (v prostoru)
na ekliptice a úhlem t, dává dokonalou možnost popsat tento poledník:
def f_ec_meridian(expr t,A)=
(A*cosd(t)+North_Ec*sind(t))
enddef;
34
Tato funkce je následně použita k definování promítnutí křivky ec_meridian
užitím makra project, stejně jako tomu bylo u zmíněné ukázky, když jsme
definovali křivku equator.
Zpětné promítání
Princip „zpětného promítání“ je velmi jednoduchý a my na něj jen letmo nahlédneme. Například když jsme chtěli zjistit bod L2 z bodu L1 v předchozím obrázku,
museli jsme na jedné straně nakreslit hlavní kružnici jdoucí skrz body L1 a N ∗ ,
jak bylo ukázáno dříve (ec_meridian), a na druhé straně oběžnou dráhu Měsíce
(moon) s realizací stejných principů. Průsečík těchto dvou promítnutých křivek
byl spočten obvyklým způsobem:
Lp2=moon intersectionpoint ec_meridian;
V této ukázce se předpokládá, že makro intersectionpoint vrátí správný
průsečík, což není vždy pravda.
Nyní je bod L2 v prostoru určen lineární kombinací vypočtenou ze dvou
vektorů tvořící základ roviny oběžné dráhy Měsíce. Tyto dva vektory mohou být
spočteny rovnicí oběžné dráhy Měsíce a budeme je nazývat moon_x a moon_y.
Tudíž dostáváme:
L2=m_x*moon_x+m_y*moon_y;
kde m_x a m_y jsou skalární veličiny. Tyto neznámé veličiny mohou být spočteny promítnutím zmíněné rovnice, protože rovnoběžné promítání je lineární
transformace:
Lp2=m_x*project(moon_x,V1,V2)+m_y*project(moon_y,V1,V2);
Tato rovnice definuje m_x a m_y z bodu v rovině Lp2, a proto zároveň definuje
L2, což je bod v prostoru.
V momentě, kdy známe L2 , můžeme tuto hodnotu použít k výpočtu L3 v úplně
stejném duchu.
Rovnoběžky
Sestrojení hlavních kružnic byla úloha relativně snadná, poněvadž kružnice jsou
vždy z poloviny viditelné a z poloviny neviditelné, omezení viditelnosti je přímo
vztažené k hlavní ose elipsy. To však není případ dalších kružnic kulové plochy.
Jimi jsou vedlejší kružnice a rovnoběžky. Podrobněji nahlédneme jen na situaci
kolem rovnoběžek k rovníku.
Rovnoběžky mají celou řadu charakteristických vlastností: nemusí mít stejný
poměr viditelné a neviditelné části; mohou být zcela viditelné, stejně tak jako
zcela neviditelné; hranice viditelnosti a skryté části neleží na hlavní ose elipsy.
Abychom nakreslili rovnoběžky správně, je nezbytně nutné, abychom určili
hranice mezi viditelnou a skrytou částí rovnoběžky.
35
Hranici viditelnosti lze nastavit jako průsečíky roviny ortogonální ke směru
−
→
pohledu pozorovatele (V3 ) a kružnice představující rovnoběžku. Průsečík buď
neexistuje žádný (rovnoběžka je kompletně viditelná, nebo zcela skryta), nebo
existují průsečíky dva (existuje jak část viditelná, tak skrytá), nebo je nalezen
průsečík jen jeden (to je přechodový stav mezi zmíněnými dvěma situacemi).
Jakmile získáme průsečíky v prostoru, jsou přepočteny na úhly a takto získané dva oblouky jsou vykresleny zvlášť za pomoci těchto úhlů. Výstupy makra
draw_parallel, v naší ukázce série čtyř rovnoběžek k rovníku, jsou nakresleny
na dalším obrázku a příslušné zdrojové kódy najdete na str. 37.
N
ekliptika
Ω
O
γ
rovnı́k
Ω′
S
Rovnice rovnoběžky na zeměpisné šířce φ je následující:
def f_parallel(expr r,theta,phi)=
(r*cosd(phi)*cosd(theta),r*cosd(phi)*sind(theta),r*sind(phi))
enddef;
36
% phi=zeměpisná šířka, col=barva, side=1 nebo -1, záleží na typu čáry
vardef draw_parallel(expr phi,col,side)=
save p; path p[]; p0=project(f_parallel(a,0,phi),V1,V2)
for t=0 step 10 until 360: ..project(f_parallel(a,t,phi),V1,V2) endfor;
% Nyní hledáme průsečíky u této rovnoběžky
% s rovinou promítnutí:
% rovina:
V3x*x+V3y*y+V3z*z=0
% rovnoběžka: x=r*cos(phi)*cos(theta), y=r*cos(phi)*sin(theta), z=r*sin(phi)
% Hledáme parametr theta:
save A,B,C,X,Y,ca,cb,cc,delta,nx,tha,thb;
numeric X[],Y[];ca=Xp(V3);cb=Yp(V3);cc=Zp(V3);
if cb=0:X1=-(cc/ca)*sind(phi)/cos(phi);nx=1;
else:
A=1+(ca/cb)**2;B=2*ca*cc*sind(phi)/(cb*cb);
C=((cc/cb)*sind(phi))**2-cosd(phi)*cosd(phi);delta=B*B-4A*C;
if delta<0:nx=0;% Nejsou žádné společné body.
else:
X1=((-B-sqrt(delta))/(2A))/cosd(phi);
% = cos(theta)
X2=((-B+sqrt(delta))/(2A))/cosd(phi);
% = cos(theta)
Y1=-((ca*X1+cc*sind(phi)/cosd(phi))/cb); % = sin(theta)
Y2=-((ca*X2+cc*sind(phi)/cosd(phi))/cb); % = sin(theta)
tha=angle(X1,Y1);thb=angle(X2,Y2);nx=2;
fi;
fi;
if nx=0: % Kompletně (ne)viditelná rovnoběžka.
if side=1:draw p0 withcolor col;
else:draw p0 withcolor col dashed evenly;fi;
message "NO INTERSECTION";
elseif nx=1:X10=angle(X1,1+-+X1);X11=360-X10;
else: % Obecná situace.
if tha<thb:X10=tha;X11=thb;else:X10=thb;X11=tha;fi;
fi;
if nx>0: % Určení obou cest.
p1=project(f_parallel(a,X10,phi),V1,V2)
for t=X10+1 step 10 until X11:..project(f_parallel(a,t,phi),V1,V2)
endfor;
p2=project(f_parallel(a,X11,phi),V1,V2)
for t=X11+1 step 10 until X10+360:..project(f_parallel(a,t,phi),V1,V2)
endfor;
% Vykreslení obou částí elipsy.
if side=1:draw p1 withcolor col;
else:draw p1 withcolor col dashed evenly;fi;
if side=1:draw p2 withcolor col dashed evenly;
else:draw p2 withcolor col;fi;
fi;
enddef;
Zdrojový kód vykreslení kružnice rovnoběžné k rovníku.
37
Závěr
Po zjištění, že řada kulových ploch není precizně narýsována v tištěných ani
v elektronických zdrojích, jsme tuto situaci podrobně prozkoumali a naprogramovali jsme několik maker v METAPOSTu, která jejich správné narýsování zvládnou.
Pouze věříme, že tento článek a vytvořená makra přispějí, byť nepřímo, k realističtějším kulovým plochám používaným v kosmografii a jinde. Tím se snad zajistí
odstranění chyb u budoucích nákresů.
Navíc se zdá, že by mohlo být zajímavé rozšířit existující grafické balíčky
o tento druh vykreslování, aby se šířilo povědomí o správném zobrazování kulových
ploch. Takové rozšíření by pro balíček PSTricks mohla být obrovská výhoda, což
by navíc umožnilo porovnání s naším vlastním přístupem k tomuto problému.
Seznam literatury
[1] Goossens, Michel; Mittelbach, Frank; Rahtz, Sebastian; Roegel, Denis; Voß,
Herbert. The LATEX Graphics Companion. [Velký průvodce grafikou v LATEXu.]
2. vyd. USA, Boston: Addison-Wesley Professional, 2007. ISBN 978-0-321-50892-8.
Summary: Spheres, great circles and parallels
Each domain has its graphical archetypes. In particular, spheres are unavoidable
components of domains such as geography or astronomy. However, when perusing
a number of publications, we noticed that spheres were often incorrectly drawn,
with respect to their features such as great circles and parallels. This article
examines several simple METAPOST techniques that remedy these problems.
The source codes are included as small parts in the article commented in
detail. You may find the original English version of the article in TUGboat, see
http://www.tug.org/members/TUGboat/tb30-1/tb94roegel-spheres.pdf.
Keywords: METAPOST, descriptive geometry, orthogonal projection, spheres,
great circles, meridians, parallels, luna orbit, ecliptic, equator, ellipsis.
Denis Roegel, [email protected]
http://www.loria.fr/ ~roegel
LORIA – Campus Scientifique, BP 239
F-54506 Vandœuvre-lès-Nancy Cedex, France
38