μ°λ¦¬μ κ°μ₯ κ°κΉμ΄ λ³, νμμ μμ£Ό μ κΈ°ν©λλ€. μμΉ μκ°κ³Ό μ€μ μκ°μ νμ¬ μμΉμ κ²¨μΈ μ¬λΆμ λ°λΌ λ€λ¦ λλ€.
μ°λ¦¬λ μ§νμ€μ μλ½ν¨μ λ λμ§ μκ³ νμμ΄ μΈλΆμ λΉμΆλμ§λ₯Ό μΆλ‘ ν μ μκΈ°λ₯Ό μν©λλ€. κ·Έλμ μ°λ¦¬λ μ΅μ νμμ§λ (μΌλͺ ββμΌκ΄μ§λ)κ° νμν©λλ€. λΉμ μ κ·Έκ²μ μμ±νλ νλ‘κ·Έλ¨μ μμ±νλ μ¬λμ λλ€!
κ·μΉ : κ·νμ νλ‘κ·Έλ¨μ νμ¬ μλ €μ§ νμμ μ΄λ€ λΆλΆμ 보μ¬μ£Όλ (μ°λ¦¬μ νμ±μ λν) μ΄λ―Έμ§ (μλ €μ§ νμ) λλ ASCII μνΈ ννμ μΆλ ₯ν΄μΌν©λλ€. νλ‘κ·Έλ¨μ λ μ°½μ μ΄κ³ λ 립μ μ΄μ΄μΌ ν©λλ€. νλ‘κ·Έλλ° μΈμ΄μ νμ€ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ μΈν μ½λλ₯Ό 볡μ¬, μ¬μ©, ν¬ν¨ λλ νΈμΆ ν μ μμ΅λλ€.
μ¬μ ν λ΄κ° λ§νλ κ²μ λν λ¨μκ° μλ€λ©΄ Wikipediaμ μκ° μμ΅λλ€.
μ΄κ²μ μΈκΈ° μ½ν μ€νΈ μ λλ€. λΉμ μ λΉμ μ λ΅μ λ¬μ±νκΈ° μν΄ λ€μ μ€ μ΄λ κ²μ λ¬μ±νλ €κ³ νλμ§ μ£Όλͺ©ν΄μΌν©λλ€ (μ¬λ¬ κ°μ§ μ ν κ°λ₯) :
-
λ¨μ . κ·μΉμ βκ·Όμ¬μΉβλΌκ³ μ ν μμ΅λλ€. κ·Όμ¬μΉκ° μ’μμλ‘μ΄ λ²μ£Όμμ λ λ§μ μ μλ₯Ό μ»μ΅λλ€. Wolfram Alpha , Time and Date λλ die.net μ λν΄ κ΅¬νμ νμΈν μ μμ΅λλ€ .
-
κΈ°λ₯μ±. μλ₯Ό λ€μ΄, λν ν μμ μ μ΄λ»μ΅λκΉ? νΉμ μμΉλ₯Ό νμ νμκ² μ΅λκΉ? λ€λ₯Έ νμ±μ λ§€ν?
-
λ―Έν. λλ₯μ 그리μκ² μ΅λκΉ? 보λμ€ ν¬μΈνΈ. μ§κ° λλ₯? 보λμ€ ν¬μΈνΈ. 3D μ§κ΅¬μμ? ꡬλ¦κ³Ό ν¨κ»? λ³? μ¬λ°λ₯Έ λ³? λκ·λͺ¨ 보λμ€ ν¬μΈνΈ. λ±λ±.
-
ννμ§ μκ±°λ μ€λλμκ±°λ λ¨μν μλͺ»λ κΈ°μ μ¬μ©. λ¬Όλ‘ , Mathematicaμμ μ΄κ²μ μ±μΈ μλ μμ§λ§ μ¬μ©μ κ³ λ €
m4
νμ΅λκΉ? SQL? μμΌλ‘? x86 μ΄μ λΈλ¦¬? -
μ₯λ. λ€μ΄ λ§₯μ μ¨ νλ‘μ μ λ§΅ μ μ¬μ©νκ³ μΆ μ΅λκΉ? μ΄μ!
-
μ§§μ μ½λ. μ΄κ²μ κ²°κ΅ μ½λ 골ν SEμ λλ€.
μ¦κΈ°μΈμ!
λ΅λ³
νμ€μΌ-μ νμ§ μ½λ
λ΄κ° μ΄κ²μ μΈ λ λλ λ§€μ° νΌκ³€νλ€.
λλ λκΈ° μκ°μ λ무 λ©λ¦¬ κ° μλ, μ΄μ¨λ , μ¬κΈ°μ βνλ‘κ·Έλ¨μ΄ μ¬μ©νλ ν¬μ¬μ΄μΌ. κΈ°λ³Έμ μΌλ‘ μ§κ΅¬μ νλΈλ₯Ό ν¬μ ν λ€μ μ κ°νλ κ²κ³Ό κ°μ΅λλ€. λνμ΄ ν¬μμμ κ·Έλ¦Όμλ μ§μ μΌλ‘ λ§λ€μ΄μ§λλ€.
μ΄ νλ‘κ·Έλ¨μ νμ¬ λ μ§ / μκ°μ μ¬μ©νκ³ stdoutμμ PPM νμΌμ μΆλ ₯ν©λλ€.
import Data.Time.Clock
import Data.Time.Calendar
import Control.Applicative
import Data.Fixed
import Data.Maybe
earth :: [[Int]]
earth = [[256],[256],[256],[256],[64,1,1,2,1,5,14,16,152],[56,19,3,27,1,6,50,1,2,1,90],[53,6,1,11,2,36,26,1,2,1,16,2,1,1,2,1,24,4,66],[47,2,5,14,4,35,22,7,54,2,1,3,60],[38,1,2,2,3,1,6,1,2,1,2,7,6,1,1,33,24,3,3,1,56,2,60],[34,2,1,4,2,1,3,1,1,3,3,2,15,3,3,29,57,5,19,1,2,11,17,1,1,1,34],[40,3,10,2,1,8,16,27,54,3,18,19,18,1,36],[33,6,5,3,2,3,1,3,2,2,1,5,16,21,1,2,53,2,10,1,6,19,1,7,4,3,9,2,33],[32,4,1,7,1,2,3,2,1,1,3,11,14,23,53,2,10,3,1,4,2,33,7,7,29],[8,5,25,10,5,3,2,14,10,2,1,18,1,2,31,6,18,1,7,4,1,60,22],[5,18,2,12,3,5,1,3,2,2,1,3,4,2,3,8,11,18,30,13,9,2,7,3,2,72,1,6,8],[4,36,2,1,1,4,3,7,1,4,3,9,8,15,34,18,2,2,2,17,1,78,4],[4,1,1,27,3,1,1,24,6,3,1,1,1,3,6,13,13,1,20,15,1,4,1,104,1],[3,31,1,24,1,2,4,8,10,9,12,6,18,7,3,7,1,1,2,99,3,2,2],[7,50,2,2,2,1,2,1,3,2,1,2,10,7,15,1,20,7,2,111,7,1],[4,35,1,15,9,1,1,3,4,1,12,5,34,8,3,110,10],[4,9,1,2,1,37,12,6,16,3,34,8,3,96,5,6,13],[6,6,1,1,8,32,12,6,3,1,49,9,4,2,1,86,1,3,4,2,19],[9,2,1,1,11,31,11,11,40,1,8,1,2,4,5,83,12,3,20],[8,1,16,33,9,11,39,2,8,1,2,3,3,83,13,5,19],[28,33,5,12,40,2,7,3,6,62,1,19,13,5,20],[27,36,2,15,34,3,2,2,6,71,1,22,11,2,22],[30,21,1,11,2,16,33,3,1,4,2,72,1,24,1,1,9,1,23],[31,21,1,26,39,4,1,98,1,1,33],[31,42,7,1,40,100,1,1,33],[33,25,2,15,4,4,35,102,36],[33,23,2,1,2,14,8,1,36,27,1,9,1,61,3,1,33],[33,26,5,14,42,10,1,11,2,2,2,7,3,5,1,9,1,44,38],[33,26,1,2,1,9,2,1,45,7,1,2,2,9,8,6,2,6,1,53,4,2,33],[33,26,1,4,1,6,44,8,6,2,3,7,9,5,3,56,1,1,4,3,33],[33,37,45,8,7,2,3,6,2,4,3,6,4,53,43],[33,36,46,6,6,1,4,1,2,2,3,16,3,47,1,5,8,2,34],[34,34,46,7,11,1,3,2,2,16,3,45,6,2,8,1,35],[34,33,48,5,11,1,4,1,4,16,2,49,3,2,6,2,35],[35,32,54,8,17,60,5,2,4,4,35],[36,30,50,12,18,60,8,2,1,1,38],[38,27,50,15,16,61,6,2,41],[38,25,51,18,3,4,6,62,6,1,42],[39,1,1,17,2,3,51,93,49],[40,1,1,11,9,2,49,31,1,10,2,50,49],[40,1,2,9,10,2,48,33,1,10,2,49,49],[41,1,2,8,11,1,47,34,2,10,5,44,50],[42,1,2,7,58,36,1,11,2,1,8,36,51],[46,6,58,36,2,15,7,34,2,1,49],[46,6,12,2,43,38,2,14,7,2,1,12,1,15,55],[46,6,5,2,7,2,41,38,2,14,10,10,4,10,59],[47,6,3,3,10,3,38,37,3,12,11,8,6,9,2,1,57],[49,10,51,38,3,9,13,7,8,9,9,2,48],[51,7,51,40,2,7,15,6,9,1,1,8,8,2,48],[55,7,47,41,1,6,17,4,12,8,8,1,49],[57,5,47,42,1,2,20,4,13,8,9,1,47],[59,3,8,1,38,43,22,4,13,1,2,4,10,2,46],[60,2,6,5,38,41,1,4,18,3,17,3,10,2,46],[61,2,1,1,2,3,1,7,34,45,18,2,18,1,60],[63,1,2,13,33,44,22,1,12,1,16,3,45],[66,14,33,43,22,1,13,1,14,1,1,1,46],[66,18,30,4,1,1,5,30,34,1,2,2,9,3,50],[66,19,43,27,34,2,2,1,7,3,52],[65,20,43,26,36,2,1,2,5,5,51],[65,21,42,24,39,3,4,7,2,1,1,1,1,1,44],[56,1,7,23,41,16,1,6,41,2,4,6,7,1,44],[64,25,39,16,1,5,42,3,4,5,2,1,8,1,2,1,37],[64,29,35,22,43,3,1,1,2,3,2,1,1,1,2,1,1,2,1,7,6,1,27],[63,31,35,20,45,2,11,1,9,7,4,2,26],[64,32,34,19,67,1,2,6,1,2,28],[65,31,34,12,1,6,48,4,18,6,31],[65,31,34,19,54,2,1,2,2,1,10,2,2,1,30],[66,29,36,14,1,3,57,1,19,2,28],[66,29,36,14,1,4,63,1,42],[67,27,36,15,1,4,63,5,3,2,33],[67,26,37,20,5,2,53,2,1,4,4,2,33],[68,25,37,20,4,3,52,9,3,3,32],[70,23,36,20,3,4,53,11,1,4,31],[71,22,37,17,5,4,51,18,31],[71,22,37,16,7,3,50,20,30],[71,21,39,15,6,3,5,1,42,24,29],[71,20,40,15,6,3,47,26,28],[71,17,43,15,6,3,46,28,27],[71,16,45,13,8,1,48,27,27],[71,16,45,12,58,28,26],[71,16,45,12,58,28,26],[70,16,47,10,59,28,26],[70,15,49,9,60,27,26],[70,14,50,7,62,7,6,13,27],[70,13,51,6,63,6,8,1,1,9,28],[70,10,138,10,28],[69,12,139,7,29],[69,11,141,5,19,3,8],[69,8,167,3,9],[69,8,166,1,1,1,10],[70,5,149,2,16,2,12],[69,6,166,3,12],[68,6,166,2,14],[68,5,166,3,14],[68,6,182],[67,6,183],[68,4,184],[68,4,6,2,176],[69,4,183],[70,5,20,1,160],[256],[256],[256],[256],[256],[256],[78,1,1,1,109,1,65],[75,2,115,1,23,1,39],[72,3,80,1,1,5,20,42,32],[74,1,70,1,4,21,5,52,2,1,25],[67,1,2,2,1,4,64,28,4,62,21],[69,9,34,1,1,1,1,1,1,1,2,48,3,69,15],[50,1,5,1,16,5,34,130,14],[32,1,1,2,4,1,3,1,4,29,32,128,18],[20,1,1,54,32,128,20],[17,49,34,137,19],[9,1,2,54,20,4,6,143,17],[16,51,18,5,10,135,21],[11,1,4,54,25,140,21],[12,66,4,155,19],[12,231,13],[0,6,9,5,2,234],[0,256],[0,256]]
main = do
header
mapM_ line [0..299]
where
header = do
putStrLn "P3"
putStrLn "# Some PPM readers expect a comment here"
putStrLn "400 300"
putStrLn "2"
line y = mapM_ (\x -> pixel x y >>= draw) [0..399]
where
draw (r, g, b) = putStrLn $ (show r) ++ " " ++ (show g) ++ " " ++ (show b)
pixel x y = fromMaybe (return (1, 1, 1)) $
mapRegion (\x y -> (50, -x, y)) (x - 50) (y - 50)
<|> mapRegion (\x y -> (-x, -50, y)) (x - 150) (y - 50)
<|> mapRegion (\x y -> (-x, y, 50)) (x - 150) (y - 150)
<|> mapRegion (\x y -> (-50, y, -x)) (x - 250) (y - 150)
<|> mapRegion (\x y -> (y, 50, -x)) (x - 250) (y - 250)
<|> mapRegion (\x y -> (y, -x, -50)) (x - 350) (y - 250)
where
mapRegion f x y = if x >= -50 && y >= -50 && x < 50 && y < 50 then
Just $ fmap (worldMap . shade) getCurrentTime
else Nothing
where
t (x, y, z) = (atan2 y z) / pi
p (x, y, z) = asin (x / (sqrt $ x*x+y*y+z*z)) / pi * 2
rotate o (x, y, z) = (x, y * cos o + z * sin o, z * cos o - y * sin o)
tilt o (x, y, z) = (x * cos o - y * sin o, x * sin o + y * cos o, z)
shade c = ((t $ rotate yearAngle $ tilt 0.366 $ rotate (dayAngle - yearAngle) $ f x y)) `mod'` 2 > 1
where
dayAngle = fromIntegral (fromEnum $ utctDayTime c) / 43200000000000000 * pi + pi / 2
yearAngle = (fromIntegral $ toModifiedJulianDay $ utctDay c) / 182.624 * pi + 2.5311
worldMap c = case (c, index (t $ f x y) (p $ f x y)) of
(False, False) -> (0, 0, 0)
(False, True) -> (0, 0, 1)
(True, False) -> (2, 1, 0)
(True, True) -> (0, 1, 2)
where
index x y = index' (earth !! (floor $ (y + 1) * 63)) (floor $ (x + 1) * 127) True
where
index' [] _ p = False
index' (x:d) n p
| n < x = p
| otherwise = index' d (n - x) (not p)
μΌκ° where
μ½λ, μ€μ²© case
, μ ν¨νμ§ μμ IO μ¬μ© μ΄ λ§μ΅λλ€ .
λ΅λ³
Haskell, βμλνλ©΄βμΉ΄ν κ³ λ¦¬μμ
κΆκΈν΄μ μ± μ μΌμ΅λλ€. 곡μμ ν©λ¦¬μ μΌλ‘ μ ννμ§λ§ [1] κ·Έλ° λ€μ μ μ ν Plate CarrΓ©e λ§΅ λμ μμ€ν€ μνΈλ₯Ό μ¬μ©ν©λλ€. ν½μ μ΄ μλ / κ²½λλ‘ λ³νλλ λ°©μμ Plate CarrΓ©eμ λν΄μλ§ μ¬λ°λ₯΄κ² μλν©λλ€.
import Data.Time
d=pi/180
tau=2*pi
m0=UTCTime(fromGregorian 2000 1 1)(secondsToDiffTime(12*60*60))
dark lat long now =
let
time=(realToFrac$diffUTCTime now m0)/(60*60*24)
hour=(realToFrac$utctDayTime now)/(60*60)
mnlong=280.460+0.9856474*time
mnanom=(357.528+0.9856003*time)*d
eclong=(mnlong+1.915*sin(mnanom)+0.020*sin(2*mnanom))*d
oblqec=(23.439-0.0000004*time)*d
ra=let num=cos(oblqec)*sin(eclong)
den=cos(eclong) in
if den<0 then atan(num/den)+pi else atan(num/den)
dec=asin(sin(oblqec)*sin(eclong))
gmst =6.697375+0.0657098242*time+hour
lmst=(gmst*15*d)+long
ha=(lmst-ra)
el=asin(sin(dec)*sin(lat)+cos(dec)*cos(lat)*cos(ha))
in
el<=0
td x = fromIntegral x :: Double
keep="NSEW"++['0'..'9']
pixel p dk=if dk && p`notElem`keep then if p==' ' then '#' else '%' else p
showMap t= do
let w=length(worldmap!!0)
h=length worldmap
putStrLn (worldmap!!0)
putStrLn (worldmap!!1)
mapM_(\y->do
mapM_(\x->let
lat=(0.5-td y/td h)*pi
long=(0.5-td x/td w)*tau
in
putStr [pixel ((worldmap!!(y+2))!!x) (dark lat long t)]) [0..(w-1)]
putStrLn "") [0..(h-4)]
putStrLn (last worldmap)
main = do {t<-getCurrentTime; showMap t}
worldmap=[
"180 150W 120W 90W 60W 30W 000 30E 60E 90E 120E 150E 180",
"| | | | | | | | | | | | |",
"+90N-+-----+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+",
"| . _..::__: ,-\"-\"._ |7 , _,.__ |",
"| _.___ _ _<_>`!(._`.`-. / _._ `_ ,_/ ' '-._.---.-.__|",
"|.{ \" \" `-==,',._\\{ \\ / {) / _ \">_,-' ` mt-2_|",
"+ \\_.:--. `._ )`^-. \"' , [_/( __,/-' +",
"|'\"' \\ \" _L oD_,--' ) /. (| |",
"| | ,' _)_.\\\\._<> 6 _,' / ' |",
"| `. / [_/_'` `\"( <'} ) |",
"+30N \\\\ .-. ) / `-'\"..' `:._ _) ' +",
"| ` \\ ( `( / `:\\ > \\ ,-^. /' ' |",
"| `._, \"\" | \\`' \\| ?_) {\\ |",
"| `=.---. `._._ ,' \"` |' ,- '. |",
"+000 | `-._ | / `:`<_|h--._ +",
"| ( > . | , `=.__.`-'\\ |",
"| `. / | |{| ,-.,\\ .|",
"| | ,' \\ / `' ,\" \\ |",
"+30S | / |_' | __ / +",
"| | | '-' `-' \\.|",
"| |/ \" / |",
"| \\. ' |",
"+60S +",
"| ,/ ______._.--._ _..---.---------._ |",
"| ,-----\"-..?----_/ ) _,-'\" \" ( |",
"|.._( `-----' `-|",
"+90S-+-----+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+",
"Map 1998 Matthew Thomas. Freely usable as long as this line is included"]
λ³΄λ€ ν₯λ―Έλ‘μ΄ μ°μ€ μκ°μ μμ μΆλ ₯ (μ°λ¦¬λ μΆλΆ κ·Όμ²μ μμΌλ―λ‘ Wander Nautaμ μ¬κ°ν λͺ¨μμ μλΉν μ νν©λλ€ :))-μ΄κ²μ 1 μ 16 μΌ 13:55:51 UTC 2014μ λλ€.
180 150W 120W 90W 60W 30W 000 30E 60E 90E 120E 150E 180
| | | | | | | | | | | | |
%90N%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%##########%#%%%%%%%%##%%%%%%%#######%7#######%#####%%%%%#############%
%##%%%%%#%#%%%%%%%%%%%%%%####%########%%%#####%%#%%%##%##%%%%%%%%%%%%%%
%%%#####%#%#%%%%%%%%%%%##%##%#%%#####%#%#%%%%%%#%################%%%2%%
%#%%%%%%%#######%%%#%%%%%#%%######, [_/( ##############%%%%%%#%
%%%%#####%#########%####%%##### oD_,--' ####%#####%%#%%###%
%#########%###########%%##### _)_.\\._<> 6 ######%%%#%##%###%
%#########%%#########%###### [_/_'` `"( ###%%%##%######%
%30N#######%%####%%%#%##### / `-'"..' `:._ ###%%##%#######%
%###%########%##%##%%##### / `:\ > \ ,-^. #%%#%#########%
%#############%%%%###%%### | \`' \| ?_)##%%#########%
%################%%%%%%%# `._._ ,' "` |' %%#%%########%
%000###############%####`-._ | / `:`<_%%%%%%######%
%##################%#### > . | , `=.%%%%%%%#####%
%###################%%# / | |{| %%%%%#####%%
%####################%# ,' \ / `' ,"#####%#####%
%30S#################% / |_' | %%##%#####%
%####################% | '-'##%%%###%%%
%####################|/ ##%####%#%
%####################\. #####%##%
%60S################ ########%
%################## ,/ ______._.--._ _..---.-------%%%%###%
%####%%%%%%%%%%%%%--_/ ) _,-'" " ##%##%
%%%%%########### `-----' ##%%%
%90S%%%%%%%%%----+-----+-----+----+-----+-----+-----+-----+-----+----%%
Map 1998 Matthew Thomas. Freely usable as long as this line is included
[1] 0μμ 360 μ¬μ΄μ κ°λ, 0μμ 24 μ¬μ΄μ μκ°, 0μμ 2pi μ¬μ΄μ λΌλμμ μ μ§νκΈ°μν μΆκ° μμ μ΄ μλ€λ©΄ λ€λ₯Έ κ³³μμ μ°Ύμ μ μμ΅λλ€. λλ κ·Έκ²μ΄ μ¬λΌμ΄λ κ·μΉμ μ¬μ©νλ μμ λΆν° μ΄μ λ κ²μ΄λΌκ³ μκ°ν©λλ€. μΌκ° ν¨μλ κ·Έ λ²μ λ°μμ μ μλν©λλ€ β¦
λ΅λ³
.
λ°°μ¬, 882 * μ
μ΄λ²μλ Aesthetics , Weird tech , Fun and Short μ½λ λ²μ£Όμ λ λ²μ§Έ νλͺ© μ λλ€. Ram Narasimhanμ μνκ³Ό Peter Taylorμ μ견μμ μκ°μ λ°μμ΅λλ€.
μ΄ μ€ν¬λ¦½νΈλ λ¨Όμ base64 μΈμ½λ© λ°μ΄ν°λ‘ λ²λ€λ‘ μ 곡λλ μ ν΄μλ ν μ€μ²λ₯Ό μμ±ν©λλ€. κ·Έλ° λ€μ ν μ€μ²κ°μλ ꡬ체λ₯Ό ν¬ν¨νλ 24 κ°μ PovRay μ₯λ©΄μ μμ±ν©λλ€. κ° κ΅¬μ²΄λ βνμμ ν₯νλλ‘βνμ ν©λλ€. λ§μ§λ§μΌλ‘ νλ μμ ImageMagickμ μ¬μ©νμ¬ GIF μ λλ©μ΄μ μΌλ‘ κ²°ν©λ©λλ€. μ¦, μ€ν¬λ¦½νΈκ° μλνλ €λ©΄ PovRayμ ImageMagickμ λͺ¨λ μ€μΉν΄μΌν©λλ€. μ격μ μμ€νλ€κ³ μκ°λλ©΄μ΄ νλͺ©μ 무μν΄λλ©λλ€.
Ramμ νλͺ© λ° μ²« λ²μ§Έ νλͺ©κ³Ό κ°μ΄ κ³μ λ³νλ₯Ό μ€λͺ νμ§ μμΌλ―λ‘ λ§€μ° μ ννμ§ μμ΅λλ€. κ·Έλ¬λ 첫 λ²μ§Έ νλͺ©λ³΄λ€ μ§§κ³ μμκ³ μ νν©λλ€. Ramμ νλͺ©κ³Ό λ¬λ¦¬μ§λ λ°μ΄ν°μ GIF μ λλ©μ΄μ μμ± μ½λκ° ν¬ν¨λμ΄ μμ΅λλ€.
echo '
iVBO Rw0KGgoAAAA NS
UhE U g AAAEgAAAA kAQMAAAAQFe4lAAAABlB
MVEUAFFwAbxKgAD63 AAAA AWJLR0 QAiAUdSAAAAAlwSFlzAAALEwAACx
MB AJqcGAAAAAd0SU1FB9 4DE hUWI op Fp5MAAADDSURBVBhXrcYhTsNQGADgr3ShE4Qi
h4BeYQFBgqAJN8Lh +r jBb rArIJHPobgAgkzgeSQkVHT7MWThAHzq44
/j/jezy6jSH M6fB gd 9T Nbxdl99R4Q+XpdNRISj4dlFRCz
oI11FxIpup4uIRDe5 fokp0Y2W25jQFDfrGNGsDNsoqBaGj34D2
bA7TcAwnmRoDZM 5tLkePUJb6uIT2rEq7hKaUhUHCXWpv7Q
PqEv1rsuoc7X RbV Bn2d kGTYKMQ3C7H8z2+wc/eMd S
QW39v8kAAA AA SUVOR K5CYII='|base64 \
-di>t;for X in {0..23};do R=$((90-(\
$X*15) )); echo "camera{location <0,
0, -5> angle 38 } light_source{
<0,0, -1000> rgb < 2,2, 2>} sphere
{<0 ,0,0> 1 pigment {
/**/ image_map{\"t\" map_type
1}} rotate <0,$R,0>
}">s ;povray +Is +H300\
+Of$X.png +W400
mogrify -fill white \
-annotate +0+10 "$X:00" \
-gravity south f$X.png
done; convert -delay \
100 -loop 0 $(ls f* \
|sort -V) ani.gif
exit;
Aμ 보λμ€ , μ¬κΈ°μ κ²°κ³Όκ° μ΄λ€ ν¬κΈ°μ μ νμμ΄μ²λΌ 보μμ κ²μ λλ€ λ¬΄μ¨ μ¦, κ³΅κ° μ μ½ν 1 λΉνΈ μ§κ°, λμ NASAμ λΈλ£¨ λ§λΈ μ΄λ―Έμ§λ₯Ό μ¬μ©νλ GIFμ λλ€ : http://i.imgur.com/AnahEIu.gif
* : μ₯μ 곡백μ ν¬ν¨νμ§ μλ 882 μ, μ΄ 1872 μ
λ΅λ³
λλ μ§§μ μ½λ μΉ΄ν κ³ λ¦¬ μμ λ΄ μμ μ νλͺ©μΌλ‘ μ½ν μ€νΈλ₯Ό μμνκΈ°λ‘ κ²°μ νμ΅λλ€ . μ€ λ°κΏμ μ μΈνκ³ 923 μ κΈΈμ΄μ λλ€.
C : 923 μ
μ½λλ λ€μκ³Ό κ°μ΅λλ€.
i;j;w=160;f=40;t;b;p;s;e;k;d=86400;q=599;
char* m="M('+z EDz :!#\"!*!8S$[\"!$!#\"\")\"!3R)V$'!!()1M./!F)\"!!!!)'/GE5@\"\"!&%.3&,Y$D\"!!%$)5i\"\"\"F\"%&&6%!e'A#!#!!#&$5&!f&A'$*\"5&!c-#'3''8\"$!!#\"U'\"=5$'8#$$\"S(#=7!*5\"!\"#['!A@6#!^H=!#6bH;!!!\"6_!!I;<&!&\"!!$\"F\"!I8;&\"#\"$&#\"C#\"I7<%#!\"/\"BP5=$*,\"=#\"$!L4A%&\"\"G\"\"\"#M1@)*F\"%P/@,!N#!S(E;!@W'E=!!!<Y&D7!&!\"$7\\$D8!)$4_$C8!('&#&!!a&@9!&(%$&g$>9!$*#(%h\">:!!-\"(%&!b!$&5:!\"+\"(!!#$!!!c+5<-!'!'!#!e)5:.!(!&!\"\"e,:25!!!\"!\"\"h-;07#\"$h.9/:\"\"$!!#\"a17-;'!\"$!!\"$!X46,<\"%\"&$\\45,>#&!$$#!W45,C!!!'!\"!$!V26,H\"#!$!\"!\"!S17-#!A!!#\"!_07,\"#A&!\"`.7+#\"A*.!Q.7*$\">/^-9)$\"=0^*<)$!>1]*<(D1])>&E2\\)>&F&!)\\)@#G$%(\\'w%]'x#,\"P%z .\"P%z .!R$z -\"S$z b#z c#z d#z 3";
main(){
t=(time(0)%d*160)/d;
printf("P2\n%d 62\n5\n",w);
for(;i<q;i++){
for(j=m[i]-' ';j>0;j--){
p=k%w,s=(t-f),e=(t+f);
printf("%c ","1324"[b*2+((p>s&&p<e)||(p>s+w&&p<e+w)||(p>s-w&&p<e-w))]);
k++;
}
b=!b;
}
}
μλ λ°©μμ λ€μκ³Ό κ°μ΅λλ€.
μΈκ³μ μμ λΉνΈ λ§΅ *λ λ¬Έμμ΄λ‘ μΈμ½λ© λ μ€ν β κΈΈμ΄μ λλ€. λ¬Έμμ΄μ λͺ¨λ λ¬Έμλ μ‘μ§ λλ λ°λ€ ν½μ μ λ°μ λνλ λλ€. κΈ΄ λ°λ€λ λ°λ€μ λ° λ€μ 0 κ°μ λλ ν½μ , κ·Έλ¦¬κ³ λ λ€λ₯Έ λ°λ€μ μͺΌκ°μ Έ μΈμ ν μμλ λ¬Έμκ° λ¬Έμμ΄μ ν¬ν¨λμ§ μλλ‘ν©λλ€. PBM νμΌμμ΄ νμμΌλ‘ λ³ννκΈ° μν΄ μμ±ν Python μ€ν¬λ¦½νΈλ λ€μκ³Ό κ°μ΅λλ€ .
κ·Έλ° λ€μ time ()μ μ¬μ©νμ¬ 1970 λ 1 μ 1 μΌ μμ μ΄ν 그리λμΉμμ λͺ μ΄κ° μ§ λ¬λμ§ μ μ μμ΅λλ€. μ€λμ λͺ μ΄κ° μ§ λ¬λμ§ μ μ μμ΅λλ€. λλ κ·Έμ λ°λΌ (λλ λ°λλλ€).
μ νμ±μ λλ΄μ λλ€. μ ν μνμ΄ μμ΅λλ€. μ΄ μ½λλ μ§κ΅¬κ° μκΈ°λ₯ (λΈλ‘ λͺ¨μμ μ£ΌμΌκ°)μ΄κ³ νμμ΄ μ λ λ°λ‘ μμ μμΌλ©° (μ¬λ¦ / κ²¨μΈ μμ), νμ (μ μμ)μ μ’μνλ€κ³ κ°μ ν©λλ€.
λνκΈ° μΈ‘λ©΄μμλ λλ₯μ 그립λλ€.
μΆλ ₯μ PGM (Portable Graymap) νμμ΄λ©°, ImageMagick λλ GIMPμ κ°μ λ°©λ²μΌλ‘ PNGλ‘ λ³ν ν μ μμ΅λλ€.
λ€μμ PNGλ‘ λ³ν λ μΆλ ₯ μμ λλ€ ( λν λ²μ ).
* : λ¨κ·Ή λλ₯μ μ μΈν μ μΈκ³, κ·Έλ¬λ κ·Έκ³³μ μ¬λ μ¬λμ β¦
λ΅λ³
Haskell-ν΄λ¨Έ νμμ λλ€.
λλ λ νλλ₯Όνλ€. μ΄μ λ²μ μμ μμ λμ΄ λͺ¨λΈμ λΉμ€λ¬ν Hammer ν¬μ μ μ¬μ©νμ¬ λ κ·Ήμ λμμ νμν©λλ€ (μ¬μ€ κ° νλ μμμ μ§κ΅¬ μ 체λ₯Όλ³΄κ³ μμ). λΉνΈ λ§΅μ μ§μ μ¬μ©νλ λμ μ΄μν μ μ μΆκ° νκΈ° μν΄ λμ μ λ°λΌ μ§κ΅¬λ₯Ό μνλ§νμ¬ κ±°μ λμΌν λ©΄μ μ μ 곡νμ΅λλ€. μ΄κ²μ΄ μ§κ΅¬λ₯Ό μ곑μν€κ³ μ½κ² νμ μν¬ μμλ κ²μ λλ€. ν΄λ¨Έμ ν¬μλ κ°μ λ©΄μ μ λλ€. λ΄ μκ°μμ΄ λ κ°μ§λ₯Ό μμΌλ‘ λ¬ΆμΌλ©΄ κ°κ²©μ μ±μΈ λ μκ³‘μ΄ μ€μ΄ λλλ€. Bresenhamμ μκ³ λ¦¬μ¦ μ μ¬μ©νμ¬ μ μ 그리면μ ν¬μμλ κ³μ μ μ νμν©λλ€ . μ§κ΅¬μ ν°λ―Έλ€μ΄ν° λΌμΈμ ν루 μ’ μΌ μμ§μ λλ€.
μ΄λ―Έμ§λ₯Ό λ λμ ν΄μλλ‘ λ³κ²½νμ§λ§ κΈ°λ³Έ λΉνΈ λ§΅μ΄ λ μ‘°μ‘νκ² λ³κ²½λλλ‘ νΈμ§νμ¬ λμ μ ν¨κ³Όλ₯Ό λ³Ό μ μμ΅λλ€. μ΄κ²μ 5000 ν¬μΈνΈ ( ~ 260000 μμ μνλ§ λ¨ )λ₯Ό μ¬μ©νλ©° 50Γ100 λΉνΈ λ§΅κ³Ό λμΌνμ§λ§ κ·Ήλ³΄λ€ μ λμ λ λ§μ ν΄μλλ₯Ό μ 곡ν©λλ€.
μ½λλ₯Ό μ¬μ©νλ €λ©΄ ghcλ‘ μ»΄νμΌνκ³ μκ° μ€νμ μΈ μ νμ μ«μ λ§€κ° λ³μλ₯Ό μ¬μ©νμ¬ μ€ννμμμ€. νμΌμ βearth0.pgmβ, βearth1.pgmβκ³Ό κ°μ΄ μμ±λ©λλ€.
import System.Environment
import Data.List (intercalate,unfoldr)
import qualified Data.Set as Set
import Data.List.Split
import Data.List
import Data.Maybe (catMaybes)
import qualified Data.Map as Map
import Data.Time
import Debug.Trace
d=pi/180
tau=2*pi
m0=UTCTime(fromGregorian 2000 1 1)(secondsToDiffTime(12*60*60))
dark::Double->Double->UTCTime->Bool
dark lat long now =
let
time=(realToFrac$diffUTCTime now m0)/(60*60*24)
hour=(realToFrac$utctDayTime now)/(60*60)
mnlong=280.460+0.9856474*time
mnanom=(357.528+0.9856003*time)*d
eclong=(mnlong+1.915*sin(mnanom)+0.020*sin(2*mnanom))*d
oblqec=(23.439-0.0000004*time)*d
ra=let num=cos(oblqec)*sin(eclong)
den=cos(eclong) in
if den<0 then atan(num/den)+pi else atan(num/den)
dec=asin(sin(oblqec)*sin(eclong))
gmst =6.697375+0.0657098242*time+hour
lmst=(gmst*15*d)+long
ha=(lmst-ra)
el=asin(sin(dec)*sin(lat)+cos(dec)*cos(lat)*cos(ha))
in
el<=0
infill(open, known)=
if null open then known else infill gen
where
neighbours (x,y)=catMaybes $ map ((flip Map.lookup) known) [(x+1,y),(x-1,y),(x,y+1),(x,y-1),(x+1,y+1),(x-1,y+1),(x-1,y-1),(x-1,y-1)]
vote a= if null a then Nothing
else Just ((sum a)`div`(length a))
fill x (open', known')=
case vote (neighbours x) of
Nothing->(x:open',known')
Just c->(open',(x,c):known')
gen=(\(o,k)->(o,Map.fromList k))$foldr fill ([], Map.toList known) open
mpoint (a,b)=case a of Nothing->Nothing;Just c->Just(c,b)
grid w h n g lut= map (\y->map (\x->if Set.member (x,y) g then 3 else case Map.lookup (x,y) lut of Nothing->7;Just c->c) [1..w]) [1..h]
unknowns w h lut=concatMap (\y->concatMap (\x->let z=1-(2*x//w-1)^2-(2*y//h-1)^2 in case Map.lookup (x,y) lut of Nothing->if z<0 then [] else [(x,y)];_->[]) [1..w]) [1..h]
main=do
args <- getArgs
let off = if null args then 0 else read(args!!0)
actual <- getCurrentTime
let now=((fromIntegral off)*60*60) `addUTCTime` actual
let tod=realToFrac(utctDayTime now)/86400+0.4
let s=5000
let w=800
let h=400
let n=6
-- pbm <- readFile "earth.pbm"
-- let bits=ungrid s$parsepbm pbm
let bits=[0,23,4,9,1,3,1,2,6,10,1,10,4,1,3,7,10,7,4,2,2,1,2,6,12,1,1,2,1,5,4,1,8,1,3,
1,21,7,2,2,35,1,4,3,2,2,2,2,16,1,25,1,2,8,1,4,1,2,13,3,2,1,26,1,1,10,3,3,8,
2,3,6,1,3,25,2,1,10,15,5,1,6,2,3,30,10,15,19,32,11,16,20,35,11,1,2,14,22,27,
1,8,14,16,22,2,1,22,1,1,2,1,1,2,1,2,1,3,16,14,25,1,2,21,1,6,1,2,1,1,2,3,17,
14,26,1,2,1,1,26,1,1,3,3,1,1,19,13,28,4,1,26,6,6,21,11,35,40,21,11,37,41,20,
2,4,4,1,1,39,19,1,6,1,16,19,2,4,5,40,18,2,7,1,17,19,1,1,1,1,1,2,3,46,7,1,5,
4,25,16,3,1,1,3,5,44,1,4,5,4,3,6,4,1,19,22,5,46,2,3,4,6,2,9,22,22,2,50,1,5,
2,1,1,6,1,8,24,15,5,1,2,51,2,5,1,1,1,5,1,10,23,14,9,55,1,4,2,17,16,1,4,14,9,
57,4,1,3,17,13,20,11,54,2,1,3,1,2,20,12,18,13,47,4,3,8,21,10,17,15,44,5,1,1,
4,1,3,2,22,10,15,16,46,4,3,1,2,2,25,9,17,15,47,1,1,3,30,9,18,13,46,2,1,4,25,
2,1,11,16,13,46,8,24,2,2,9,16,11,45,12,22,1,3,7,17,10,45,12,21,1,3,7,19,8,
43,12,25,6,19,8,41,12,25,5,20,7,40,11,25,4,20,6,40,5,3,2,48,6,38,3,54,4,30,
1,6,2,55,2,29,1,5,1,53,3,28,1,55,3,49,1,30,2,76,1,284,3,4,1,15,1,17,10,1,9,
7,1,13,21,4,4,1,2,6,17,2,8,3,63]
let t(phi,lambda)=unitsphere$rx (-pi/4)$rz (-tod*4*pi)$sphereunit(phi, lambda)
let hmr=(fmap (\(x,y)->(floor((fl w)*(x+4)/8),floor((fl h)*(y+2)/4)))).hammer.t
let g=graticule hmr n
let lut = Map.fromList$ catMaybes $map mpoint$map (\((lat,long),bit)->(hmr(lat,long),bit*4+2-if dark lat long now then 2 else 0)) $zip (spiral s) (rld bits)
-- let lut = Map.fromList$ catMaybes $map mpoint$map (\((lat,long),bit)->(hmr(lat,long),bit))$zip (spiral s) (rld bits)
let lut' = infill ((unknowns w h lut), lut)
let pgm = "P2\n"++((show w)++" "++(show h)++" 7\n")++(intercalate "\n" $ map (intercalate " ")$chunksOf 35 $ map show(concat$grid w h n g lut'))++"\n"
writeFile ("earth"++(show off)++".pgm") pgm
fl=fromIntegral
spiral::Int->[(Double,Double)]
spiral n=map (\k-> let phi=acos(((2*(fl k))-1)/(fl n)-1) in rerange(pi/2-phi,sqrt((fl n)*pi)*phi)) [1..n]
rld::[Int]->[Int]
rld bits=concat$rld' (head bits) (tail bits)
where
rld' bit []=[]
rld' bit (run:xs) = (replicate run bit):(rld' (case bit of 1->0;_->1) xs)
rle::[Int]->[Int]
rle bits=(head bits):(map length$group bits)
sample::Int->Int->Int->[(Int,Int)]
sample n w h = map (\(phi, theta)->((floor((fl h)*((phi-(pi/2))/pi)))`mod`h, (floor((fl w)*(theta-pi)/(tau)))`mod`w )) $ spiral n
ungrid::Int->[[Int]]->[Int]
ungrid n g = rle $ map (\(y, x)->(g!!y)!!x) (sample n w h)
where w = length$head g
h = length g
parsepbm::[Char]->[[Int]]
parsepbm pbm=
let header = lines pbm
format = head header
[width, height] = map read$words (head$drop 1 header)
rest = drop 2 header
d = ((map read).concat.(map words)) rest
in chunksOf width d
rerange(phi,lambda)
| abs(phi)>pi = rerange(phi - signum(phi)*tau, lambda)
| abs(phi)>pi/2 = rerange(phi-signum(phi)*pi, lambda+pi)
| abs(lambda)>pi = rerange(phi, lambda - signum(lambda)*tau)
| otherwise = (phi, lambda)
laea(phi,lambda)=if isInfinite(z) then Nothing else Just (z*cos(phi)*sin(lambda),z*sin(phi)) where z=4/sqrt(1+cos(phi)*cos(lambda))
hammer(phi,lambda)=case laea(phi, lambda/2) of Nothing->Nothing; Just(x,y)->Just (x, y/2)
bresenham :: (Int, Int)->(Int, Int)->[(Int, Int)]
bresenham p0@(x0,y0) p1@(x1,y1)
| abs(dx)>50||abs(dy)>50=[]
| x0>x1 = map h$ bresenham (h p0) (h p1)
| y0>y1 = map v$ bresenham (v p0) (v p1)
| (x1-x0) < (y1-y0) = map f$ bresenham (f p0) (f p1)
| otherwise = unfoldr (\(x,y,d)->if x>x1 then Nothing else Just((x,y),(if 2*(d+dy)<dx then(x+1,y,d+dy)else(x+1,y+1,d+dy-dx)))) (x0,y0,0)
where
h(x,y)=(-x,y)
v(x,y)=(x,-y)
f(x,y)=(y,x)
dx=x1-x0
dy=y1-y0
globe n k=
(concatMap (\m->map (meridian m) [k*(1-n)..k*(n-1)]) [k*(1-2*n),k*(2-2*n)..k*2*n])
++(concatMap (\p->map (parallel p) [k*(-2*n)..k*2*n]) [k*(1-n),k*(2-n)..k*(n-1)])
where
meridian m p=(radians(p,m),radians(p+1,m))
parallel p m=(radians(p,m),radians(p,m+1))
radians(p,m)=rerange((p//(k*n))*pi/2,(m//(k*n))*pi/2)
graticule f n=Set.fromList $ concatMap (\(a,b)->case (f a,f b) of (Nothing,_)->[];(_,Nothing)->[];(Just c,Just d)->bresenham c d) (globe n 4)
rx theta (x,y,z) = (x, y*(cos theta)-z*(sin theta), y*(sin theta)+z*(cos theta))
ry theta (x,y,z) = (z*(sin theta)+x*(cos theta), y, z*(cos theta)-x*(sin theta))
rz theta (x,y,z) = (x*(cos theta)-y*(sin theta), x*(sin theta)+y*(cos theta), z)
sphereunit (phi, theta) = (rz theta (ry (-phi) (1,0,0)))
unitsphere (x,y,z) = (asin z, atan2 y x)
x//y=(fromIntegral x)/(fromIntegral y)
λ΅λ³
C, pnm μ΄λ―Έμ§ μ¬μ©
μ νμ± κ³Ό λ―Έν μ μ€μ μ λ λ¦μ λ΅λ³ . μΆλ ₯μ ν©νΌμ μ€νΈλΌμ΄νλ₯Ό ν¬ν¨νμ¬ λ κ°μ μ λ ₯ μ΄λ―Έμ§ (day.pnm λ° night.pnm)κ° νΌν©λμ΄ μμ΅λλ€. NASAμ νλμ λ리μμ κΈ°λ°μΌλ‘ ν μ΄λ―Έμ§λ₯Ό μ¬μ©νκ³ μμ΅λλ€.
μ½λλ λͺ νμ±μ μν΄ λ΄ μμ μ img.hλ₯Ό μ¬μ©ν©λλ€ (μ격ν κ·μΉ μ€μλ₯Ό μν΄ .cμ κ·Έλλ‘ ν¬ν¨λμ΄ μλ€κ³ μμν΄λ³΄μμμ€ β¦). κ±°κΈ°μμλ λͺ¨λ κ²μ C λ§€ν¬λ‘λ₯Ό ν΅ν΄ ꡬνλ©λλ€. μ λλ©μ΄μ μ μ¬λ¬ νλ μμμ λ³ν λ imagemagicksλ‘ λΉλλ©λλ€. νλ‘κ·Έλ¨ μ체λ μ μ μ΄λ―Έμ§ λ§ μΆλ ₯ν©λλ€. μ½λλ λ€μκ³Ό κ°μ΅λλ€.
μ§κΈ : (8 μ 13 μΌ ~ 13 : 00 CEST)
ν루 : (1 μ 1 μΌ)
1 λ : (12:00 UTC)
sun.c
#include <math.h>
#include <time.h>
#include "img.h"
#ifndef M_PI
#define M_PI 3.14159265359
#endif
double deg2rad(double x) {return x / 180.0 * M_PI;}
double rad2deg(double x) {return x * 180.0 / M_PI;}
double sind(double x) {return sin(deg2rad(x));}
double cosd(double x) {return cos(deg2rad(x));}
double asind(double x) {return rad2deg(asin(x));}
double elevation(double latitude, double longitude, int yday, int hour, int min, int sec)
{
double fd = (hour + (min + sec / 60.0) / 60.0) / 24.0;
double fyd = 360.0 * (yday + fd) / 366.0;
double m = fyd - 3.943;
double ta = -1.914 * sind(m) + 2.468 * sind(2 * m + 205.6);
double hourangle = (fd - 0.5) * 360.0 + longitude + ta;
double decl = 0.396 - 22.913 * cosd(fyd) + 4.025 * sind(fyd) - 0.387 * cosd(2 * fyd) + 0.052 * sind(2 * fyd) - 0.155 * cosd(3 * fyd) + 0.085 * sind(3 * fyd);
return asind(cosd(hourangle) * cosd(decl) * cosd(latitude) + sind(decl) * sind(latitude));
}
int main(int argc, char* argv[])
{
Image day, night, out;
int x, y;
time_t t = time(0);
struct tm* utc = gmtime(&t);
int yday = utc->tm_yday, hour = utc->tm_hour, min = utc->tm_min, sec = utc->tm_sec;
imgLoad(day, "day.pnm");
imgLoad(night, "night.pnm");
imgLoad(out, "day.pnm");
for(y = 0; y < day.height; ++y)
{
double latitude = 90.0 - 180.0 * (y + 0.5) / day.height;
for(x = 0; x < day.width; ++x)
{
double longitude = -180.0 + 360.0 * (x + 0.5) / day.width;
double elev = elevation(latitude, longitude, yday, hour, min, sec);
double nf = elev > -0.8 ? 0.0 : elev > -6.0 ? 0.5 : 1.0;
double df = 1.0 - nf;
Color dc = imgGetColor(day, x, y);
Color nc = imgGetColor(night, x, y);
imgDotC3(out, x, y, df * dc.r + nf * nc.r, df * dc.g + nf * nc.g, df * dc.b + nf * nc.b);
}
}
imgSave(out, "out.pnm");
}
img.h
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct
{
unsigned char r;
unsigned char g;
unsigned char b;
} Color;
typedef struct
{
Color* data;
int width;
int height;
Color c;
} Image;
#define imgCreate(img, w, h) {\
int length;\
(img).width = (w);\
(img).height = (h);\
length = (img).width * (img).height * sizeof(Color);\
(img).data = malloc(length);\
memset((img).data, 0, length);\
(img).c.r = (img).c.g = (img).c.b = 0;\
}
#define imgDestroy(img) {\
free((img).data);\
(img).width = 0;\
(img).height = 0;\
(img).c.r = (img).c.g = (img).c.b = 0;\
}
#define imgSetColor(img, ur, ug, ub) {\
(img).c.r = (ur);\
(img).c.g = (ug);\
(img).c.b = (ub);\
}
#define imgDot(img, x, y) {\
(img).data[(int)(x) + (int)(y) * (img).width] = (img).c;\
}
#define imgDotC3(img, x, y, ur, ug, ub) {\
(img).data[(int)(x) + (int)(y) * (img).width].r = (ur);\
(img).data[(int)(x) + (int)(y) * (img).width].g = (ug);\
(img).data[(int)(x) + (int)(y) * (img).width].b = (ub);\
}
#define imgDotC(img, x, y, c) {\
(img).data[(int)(x) + (int)(y) * (img).width] = (c);\
}
#define imgGetColor(img, x, y) ((img).data[(int)(x) + (int)(y) * (img).width])
#define imgLine(img, x, y, xx, yy) {\
int x0 = (x), y0 = (y), x1 = (xx), y1 = (yy);\
int dx = abs(x1 - x0), sx = x0 < x1 ? 1 : -1;\
int dy = -abs(y1 - y0), sy = y0 < y1 ? 1 : -1;\
int err = dx + dy, e2;\
\
for(;;)\
{\
imgDot((img), x0, y0);\
if (x0 == x1 && y0 == y1) break;\
e2 = 2 * err;\
if (e2 >= dy) {err += dy; x0 += sx;}\
if (e2 <= dx) {err += dx; y0 += sy;}\
}\
}
#define imgSave(img, fname) {\
FILE* f = fopen((fname), "wb");\
fprintf(f, "P6 %d %d 255\n", (img).width, (img).height);\
fwrite((img).data, sizeof(Color), (img).width * (img).height, f);\
fclose(f);\
}
#define imgLoad(img, fname) {\
FILE* f = fopen((fname), "rb");\
char buffer[16];\
int index = 0;\
int field = 0;\
int isP5 = 0;\
unsigned char c = ' ';\
while(field < 4)\
{\
do\
{\
if(c == '#') while(c = fgetc(f), c != '\n');\
} while(c = fgetc(f), isspace(c) || c == '#');\
index = 0;\
do\
{\
buffer[index++] = c;\
} while(c = fgetc(f), !isspace(c) && c != '#' && index < 16);\
buffer[index] = 0;\
switch(field)\
{\
case 0:\
if (strcmp(buffer, "P5") == 0) isP5 = 1;\
else if (strcmp(buffer, "P6") == 0) isP5 = 0;\
else fprintf(stderr, "image format \"%s\" unsupported (not P5 or P6)\n", buffer), exit(1);\
break;\
case 1:\
(img).width = atoi(buffer);\
break;\
case 2:\
(img).height = atoi(buffer);\
break;\
case 3:\
index = atoi(buffer);\
if (index != 255) fprintf(stderr, "image format unsupported (not 255 values per channel)\n"), exit(1);\
break;\
}\
field++;\
}\
imgCreate((img), (img).width, (img).height);\
if (isP5)\
{\
int length = (img).width * (img).height;\
for(index = 0; index < length; ++index)\
{\
(img).data[index].r = (img).data[index].g = (img).data[index].b = fgetc(f);\
}\
}\
else\
{\
fread((img).data, sizeof(Color), (img).width * (img).height, f);\
}\
fclose(f);\
}
λ΅λ³
R : ggplot2 λ° λ§΅ νλ‘μ μ μ¬μ©
@mniipμ κ²μλ¬Όμμ μκ°μ μ»μ Rμ mapproj ν¨ν€μ§λ₯Ό μ¬μ©νκΈ°λ‘ κ²°μ νμ΅λλ€. ν¬μμ κ³μ°ν λ λΆκ·Ήμ΄ μμ΄μΌνλ μμΉλ₯Ό μ§μ νμ¬ μ§κ΅¬ λ°©ν₯μ μ§μ ν μ μμ΅λλ€.
νμ¬ GMT μκ°μ κΈ°μ€μΌλ‘ νμ¬ μ μ€μ κ²½λλ₯Ό κ³μ°νκ³ κ·Έ μ§μ μμ§λμ μ€μ¬μΌλ‘ λ§λλλ€. μ°λ¦¬λ βνμμ κ΄μ βμμ μ§κ΅¬λ₯Όλ³΄κ³ μμ΅λλ€.
μ½λμ λλΆλΆμ λ―Ένμ λλ€. λ΄κ° μμ λ΄μΌ ν μ μΌν λΆλΆμ βμ μ€ κ²½λβλ₯Ό κ³μ°νλ κ²μ΄ μμ΅λλ€. μ΄λ GMT μκ°μ΄ μ£Όμ΄μ§ μ μ€ μΈ κ²½λ κ°μ λλ€.
library(ggplot2);library(maps);library(ggmap)
world <- map_data("world")# a lat-long dataframe from the maps package
worldmap <- ggplot(world, aes(x=long, y=lat, group=group)) +
geom_path(color="orange") +
theme(panel.background= element_rect("black"),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
panel.grid.major = element_line(colour="blue", size=0.75),
panel.grid.minor = element_line(colour="blue")
)
#Create a function that takes in the current GMT time
print_3d_coordmap <- function (current_gmt_time) {
curr_gmt_mins <- as.POSIXlt(current_gmt_time)$hour*60 + as.POSIXlt(current_gmt_time)$min
noon_longitude <- 180 - (curr_gmt_mins * 360/1440)
#centered at wherever longitude where it is Noon now on (lat:equator)
worldmap + coord_map("ortho", orientation=c(0, noon_longitude, 0))
}
#test it out
print_3d_coordmap(Sys.time() + 7*60*60) # my location is 7 hours behind UTC
κ·Έλ° λ€μ R μ λλ©μ΄μ ν¨ν€μ§ λ₯Ό μ¬μ©νμ¬ 24 κ°μ μ΄λ―Έμ§λ₯Ό μμ±νκ³ νλμ GIFλ‘ μ°κ²°νμ΅λλ€.