क्या बाहर अंधेरा है? सूर्य का नक्शा बनाएं!


71

हमारा सबसे करीबी तारा, सूरज, काफी काल्पनिक है। यह जिस समय उगता है और सेट करता है, इस पर निर्भर करता है कि आप कहां हैं, और यह सर्दी है या नहीं।

अगर हम अपने तहखानों की सुख-सुविधाओं को छोड़ने के बिना बाहर चमक रहे हैं, तो हम कटौती करने में सक्षम होना पसंद करेंगे - यही कारण है कि हमें अप-टू-डेट सूरज का नक्शा (उर्फ डेलाइट मैप) चाहिए। आप एक प्रोग्राम लिखने के लिए हैं जो कि बस उत्पन्न करता है!

नियम: आपके कार्यक्रम को हमारे ग्रह के एक चित्र (एक ज्ञात प्रारूप में) या एक ASCII कला का प्रतिनिधित्व करना चाहिए, जो (वर्तमान में एक सन्निकटन) दिखा रहा है कि कौन से भाग वर्तमान में सूर्य द्वारा जलाए गए हैं। आपका कार्यक्रम मूल और स्व-निहित होना चाहिए : आपको अपनी प्रोग्रामिंग भाषा के मानक पुस्तकालयों को छोड़कर किसी भी कोड को कॉपी करने, उपयोग करने, शामिल करने या कॉल करने की अनुमति नहीं है।

यदि आपके पास अभी भी कोई सुराग नहीं है कि मैं किस बारे में बात कर रहा हूं, तो यहां विकिपीडिया से एक उदाहरण दिया गया है:

उदाहरण सूरज का नक्शा

यह एक लोकप्रियता प्रतियोगिता है । आपको अपने उत्तर में ध्यान देना चाहिए कि आप निम्नलिखित में से कौन सा प्रयास करना चाहते हैं (एकाधिक विकल्प संभव):

  • शुद्धता। ध्यान दें कि नियम कहते हैं कि 'एक सन्निकटन' - बेहतर आपका सन्निकटन, इस श्रेणी में अधिक अंक। आप वुल्फराम अल्फा , टाइम एंड डेट या die.net's के खिलाफ अपने कार्यान्वयन की जांच कर सकते हैं ।

  • कार्यक्षमता। उदाहरण के लिए, अन्तरक्रियाशीलता के बारे में क्या? विशिष्ट स्थानों को चिह्नित करना? अन्य ग्रहों का मानचित्रण?

  • सौंदर्य। महाद्वीपों को खींचना? बोनस अंक। बनावट महाद्वीपों? बोनस अंक। एक 3D पृथ्वी पर? बादलों के साथ? सितारे? सही तारों? बड़े पैमाने पर बोनस अंक। और इसी तरह।

  • असामान्य, पुराने, या सिर्फ सादे गलत तकनीक का उपयोग करना। ज़रूर, आप इसे गणितज्ञ में कोड़ा मार सकते हैं, लेकिन क्या आपने उपयोग करने पर विचार किया है m4? एसक्यूएल? आगे? x86 विधानसभा?

  • आनंद। एक डायमैक्सियन-प्रक्षेपण मानचित्र का उपयोग करना चाहते हैं ? आगे बढ़ें!

  • छोटे संकेत। यह सब के बाद, कोड गोल्फ एसई है।

मज़े करो!


3
@PeterTaylor शायद! मुझे लगता है कि आपको प्रकाश व्यवस्था करने की भी ज़रूरत नहीं है: आप एक 3 डी पृथ्वी को आकर्षित कर सकते हैं और इसे घुमा सकते हैं ताकि दिन का हिस्सा (और कुछ नहीं) दर्शक का सामना कर सके। यह ग्रह के रात के हिस्से को नहीं दिखाएगा, लेकिन इसकी आवश्यकता नहीं है।
वांडर नौटा

30
एक वैकल्पिक समाधान बस विंडोज़ स्थापित करने के लिए है। (तलघर में, मेरा मतलब है।)
स्क्वीश ossifrage

2
@qwr मैं m4इस कार्य के लिए सप्ताह के किसी भी दिन x86 असेंबली ले जाऊँगा ...
वांडर नौटा

3
इसके अलावा: "सूरज काफी उग्र है क्योंकि यह अलग-अलग समय पर उगता है और सेट होता है।" निश्चित रूप से सूर्य का दोष: P
qwr

2
@qwr एवर ने सोचा कि अगर हम 10-घंटे के दिन, 10-दिन के सप्ताह, 10-सप्ताह के महीनों और 10-महीने के वर्षों, और सूरज के बीच t = 0 और t = 5 के लिए कितना आसान समय / तारीख की गणना करेंगे? लेकिन नहीं, सूरज को अलग-अलग समय पर अलग-अलग स्थानों पर अपना कुरूप चेहरा दिखाना होगा और पृथ्वी के चारों ओर जाने के लिए बहुत लंबा समय लेना होगा। कोई शिकायत विभाजन भी नहीं। घृणित।
वांडर नौटा

जवाबों:


89

हास्केल - निम्न गुणवत्ता कोड

जब मैंने यह लिखा तो मैं बेहद थका हुआ था।

मैं अनुमानों के साथ बहुत दूर चला गया हो सकता है, वैसे भी, यहाँ प्रक्षेपण कार्यक्रम का उपयोग करता है। मूल रूप से एक क्यूब पर पृथ्वी को पेश करना और फिर उसे खोलना पसंद है। इसके अलावा, इस प्रक्षेपण में, छाया सीधी रेखाओं से बनी होती है।
कार्यक्रम वर्तमान तिथि / समय का उपयोग करता है, और 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 उपयोग।


यह ट्विस्टेड जीनियस का काम है। एक सुझाव, के fromIntegral (fromEnum $ utctDayTime c)रूप में है (realToFrac $ utctDayTime c)। (मैंने अपना उत्तर लिखते समय केवल यही सीखा)
bazzargh

8
मैं उस .gif को पूरे दिन देख सकता था।
माइकेलियर

mnlip, मैं @mikeTheLiar से सहमत हूं। आपको अपने उत्तर के शीर्ष पर उस gif को एम्बेड करना चाहिए, आपको सभी वोट मिलेंगे।
बज्जारग

1
मैंने पूरी तरह से निराला जिफ़ पर वोट दिया। यह दुनिया को देखने के लिए सिर्फ एक मुड़ रास्ता है।
एलन गोल्ड

कभी इतना थोड़ा सा
दुखद

61

हास्केल, 'क्योंकि यह वहाँ है' श्रेणी में है

मैं उत्सुक था इसलिए मैंने एक लिखा। सूत्र यथोचित रूप से सटीक हैं [1], लेकिन फिर मैं एक उचित प्लेट कैरी मैप के बजाय कुछ एससीआई कला का उपयोग करता हूं, क्योंकि यह अच्छा लग रहा था (जिस तरह से मैं पिक्सल को लैट / लॉन्ग में परिवर्तित करता हूं वह केवल प्लेट कैरी के लिए सही ढंग से काम करता है)

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"]

उदाहरण आउटपुट, वर्ष के अधिक दिलचस्प समय से (हम विषुव के पास हैं, इसलिए वांडर नौटा का आयताकार ब्लब्स काफी सटीक है :)) - यह जनवरी 16 13:55:51 यूटीसी 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

[१] वे वही हैं जो आपको कहीं और मिलेंगे, ० और ३६० के बीच की डिग्री, ० और २४ के बीच के घंटे और रेडियों को ० और २ के बीच रखने के लिए अतिरिक्त काम के बिना। मुझे लगता है कि उन दिनों के होल्डओवर हैं जिनसे हमने स्लाइड नियमों का उपयोग किया था; ट्रिगर फ़ंक्शंस उन सीमाओं के बाहर ठीक काम करते हैं ...


7
प्रतिभाशाली! मुझे पसंद है कि आप अभी भी 'अंधेरे' के माध्यम से नक्शा देख सकते हैं। इसके अलावा, गणित ठोस दिखता है। क्या आप उदाहरण के लिए आपके द्वारा उपयोग की गई तारीख को जोड़ सकते हैं, इसलिए अन्य लोग आपके समाधान की तुलना आप से कर सकते हैं?
वांडर नौटा

मैं देखता हूं कि आपने तारीख जोड़ दी है, धन्यवाद!
वांडर नौटा

1
हां। मुझे यह पसंद है कि छवि में आप स्पष्ट रूप से देख सकते हैं कि यह उत्तरी गोलार्ध में सर्दियों की है, इस तारीख को मानना ​​आसान है! मुझे खुशी है कि आपने मेरे सामने एक उत्तर पोस्ट किया, मुझे एक गोल्फ संस्करण को करने की कोशिश कर रहे अंतहीन फाफ को बचाया, इसके लिए कोई उपाय नहीं है कि मैं आपको इसके लिए हरा दूं।
बज्जारग

39

एनीमेशन

बैश, 882 * अक्षर

यह मेरी दूसरी प्रविष्टि है, इस बार सौंदर्यशास्त्र , अजीब तकनीक , मज़ा और लघु कोड श्रेणियों में। यह राम नरसिम्हन की प्रविष्टि और पीटर टेलर की टिप्पणी से प्रेरित है।

स्क्रिप्ट पहले बेस-एनकोडेड डेटा के रूप में बंडल की गई दुनिया की एक कम-रेज बनावट को उत्पन्न करती है। यह तब 24 PovRay- दृश्यों को उस बनावट के साथ उत्पन्न करता है, जिसमें से प्रत्येक को 'सूरज का सामना' करने के लिए घुमाया जाता है। अंत में, ImageMagick का उपयोग करके फ़्रेमों को GIF एनीमेशन में जोड़ा जाता है। इसका मतलब यह है कि आपके पास स्क्रिप्ट के लिए PovRay और ImageMagick दोनों काम करने के लिए स्थापित होना चाहिए - इस प्रविष्टि को अनदेखा करने के लिए स्वतंत्र महसूस करें यदि आपको लगता है कि इसे अयोग्य घोषित करना चाहिए।

राम की प्रविष्टि, और मेरी पहली प्रविष्टि की तरह, यह मौसमी परिवर्तन के लिए जिम्मेदार नहीं है, जिसका अर्थ है कि यह बहुत सटीक नहीं है। हालांकि, यह मेरी पहली प्रविष्टि की तुलना में छोटा, प्रेटियर और अधिक सटीक है - और राम की प्रविष्टि के विपरीत, मैप डेटा और जीआईएफ एनीमेशन उत्पन्न करने के लिए कोड शामिल हैं।

                               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;

एक बोनस के रूप में , यहां एक GIF है जो अंतरिक्ष-बचत 1-बिट बनावट के बजाय नासा की ब्लू मार्बल छवि का उपयोग करता है, अर्थात बिना किसी आकार के प्रतिबंध के बिना परिणाम कैसा दिखता होगा: http://i.imgur.com/AnahEIu.gif

*: 882 वर्ण कुल मिलाकर सजावटी व्हाट्सएप नहीं, 1872 वर्ण।


5
यह सब स्वयं को बनाने के लिए +1। और स्वयं-संदर्भ कोड बनाने के लिए भी जो स्वयं एक विश्व मानचित्र की तरह दिखता है। अच्छा काम।
राम नरसिम्हन

1
अरे! अनेक प्रविष्टियाँ। अब मैं एक पागल नहीं करने के लिए अपना बहाना खो रहा हूं ...
bazzargh

1
ये तो बकवास है! इसे प्यार करना।
पैंडुबियर

हे, मुझे अब एहसास हुआ कि मैं कोड के स्वरूपण का उपयोग विश्व मानचित्र (स्रोत = महासागर, बाकी सब = भूमि) के स्रोत के रूप में कर सकता था और वास्तव में कम वर्णों के साथ बेहतर समाधान प्राप्त कर सकता था । ओह अच्छा ...
नौंटा

2
यह Minecraft की तरह दिखता है।
कज़ वोल्फ

25

मैंने शॉर्ट कोड श्रेणी में अपनी खुद की प्रविष्टि के साथ प्रतियोगिता को किक करने का फैसला किया । यह 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 लैंड पिक्सल, फिर समुद्र में एक और रन, जिससे कि स्ट्रिंग में अनपेक्षित वर्णों को शामिल किया जा सके। पायथन स्क्रिप्ट मैंने पीबीएम फाइलों को इस प्रारूप में बदलने के लिए लिखी है

फिर मैं समय का उपयोग करता हूं () यह जानने के लिए कि आधी रात के बाद से ग्रीनविच में कितने सेकंड बीत चुके हैं, 1 जनवरी 1970। मैंने यह पता लगाने के लिए कि आज कितने सेकंड बीत चुके हैं, उस जानकारी का उपयोग करके मानचित्र के हल्के हिस्से को और अधिक- या कम तदनुसार (मुझे आशा है)।

सुधार एक मजाक है। कोई गणित नहीं है। कोड मानता है कि पृथ्वी एक सिलेंडर है (दिन के आकार / दिन ब्लॉक), कि सूरज सीधे भूमध्य रेखा (कोई गर्मी / सर्दी) से ऊपर नहीं है, और यह कि आपको रंग ग्रे (कोई रंग नहीं) पसंद है।

प्लस साइड पर, मैं महाद्वीपों को आकर्षित करता हूं।

आउटपुट पोर्टेबल ग्रेमैप (PGM) प्रारूप में है, जिसे बाद में ImageMagick या GIMP जैसी किसी चीज़ से PNG में परिवर्तित किया जा सकता है।

यहाँ एक उदाहरण आउटपुट है, जिसे PNG ( बड़े संस्करण ) में परिवर्तित किया गया है :

उदाहरण आउटपुट

*: अंटार्कटिका को छोड़कर पूरी दुनिया, लेकिन वहाँ वैसे भी कौन रहता है ...


1
अच्छा उत्पादन, यह बेहतर होगा यदि अंधेरे क्षेत्र को घुमावदार किया गया था
qwr

1
हां! आउटपुट के घुमावदार होने का मतलब है कि आपको कुछ त्रिकोणमिति करना होगा, हालांकि इससे बहुत अधिक समय लगेगा। (या मुझे लगता है कि आप सही कोनों को गोल कर सकते हैं ताकि यह सही-ईश दिख सके ...)
वांडर नौटा

1
@AnderNauta कुछ गंभीर रूप से लोगों को नाराज कर देगा, जो आपको धोखा देंगे कि आप उन्हें ध्यान में नहीं
रखेंगे

@ अगर आप अपने पेंगुइन की तरह डंडे पर रहते हैं, तो आपको इस कार्यक्रम की ज़रूरत नहीं है - आधी रात का सूरज और सभी।
वांडर नौटा

22

हास्केल - यह हैमर समय है।

यहाँ छवि विवरण दर्ज करें

मैंने एक और किया। मेरे पिछले संस्करण से अनुकूलित, यह एक ही समय में दोनों ध्रुवों को दिखाने के लिए एक तिरछे हथौड़ा प्रक्षेपण का उपयोग करता है (वास्तव में आप प्रत्येक फ्रेम में पूरी पृथ्वी को देख रहे हैं)। बस जोड़ा अजीबता के लिए, सीधे एक बिटमैप का उपयोग करने के बजाय, मैंने लगभग बराबर क्षेत्र कवरेज देने के लिए एक सर्पिल के साथ पृथ्वी का नमूना लिया ; यह वही है जो मुझे पृथ्वी को विकृत करने और इसे आसानी से घुमाने की अनुमति देता है। हैमर का प्रक्षेपण समान क्षेत्र भी है; मेरा विचार यह था कि इन दोनों चीजों को जोड़ देने से मैं अंतराल में भर जाने पर कम विकृति पैदा करूंगा। मैं प्रक्षेपण पर एक ग्रैच्युल भी प्रदर्शित करता हूं, जिसमें रेखाओं को खींचने के लिए ब्रेसेनहैम के एल्गोरिदम का उपयोग किया गया है। ग्लोब और टर्मिनेटर लाइन दोनों दिन के दौरान चलती हैं।

छवि को उच्च रिज़ॉल्यूशन में बदलने के लिए संपादित किया गया है, लेकिन (जानबूझकर) मोटे बिटमैप में मोटे तौर पर, ताकि आप सर्पिल के प्रभाव को देख सकें। यह 50x100 बिटमैप के बराबर 5000 अंक ( ~ 260000 से नमूना ) का उपयोग करता है , लेकिन ध्रुवों की तुलना में भूमध्य रेखा को अधिक संकल्प देता है।

कोड का उपयोग करने के लिए, 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)    

3
यह पागलपन है। बिलकुल पागलपन। मुझे यह पसंद है।
वांडर नौटा

1
इस परिवर्तन को ठीक करने में मुझे इतना समय लगा। अकेले सर्पिल बिटमैप प्रफुल्लित करने वाला है।
bazzargh

"यह बहुत अच्छी तरह से स्केल करता है" - क्या आपका मतलब है कि आप आसानी से एक उच्च-रिज़ॉल्यूशन GIF बना सकते हैं?
वांडर नौटा

हाँ। काफी बड़ा। मैंने उस कोड को थोड़ी देर के लिए बाहर निकाल लिया, जबकि मैंने
ग्रैच्युटी के साथ खिलवाड़ किया

1
वहाँ आप जाते हैं - crazytown की अच्छी बड़ी छवि
bazzargh

21

सी, पीएनएम छवियों का उपयोग कर

देर से जवाब, शुद्धता और सौंदर्यशास्त्र पर ध्यान केंद्रित करना । आउटपुट दो इनपुट छवियों (day.pnm और night.pnm) का एक मिश्रण है, जिसमें गोधूलि की पट्टी भी शामिल है। मैं यहाँ NASAs नीले संगमरमर पर आधारित चित्रों का उपयोग कर रहा हूँ।

कोड स्पष्टता के लिए मेरे स्वयं के img.h का उपयोग करता है (बस कल्पना करें कि इसे कड़े नियम अनुपालन के लिए .c में शामिल किया गया है ...)। वहाँ सब कुछ सी मैक्रोज़ के माध्यम से कार्यान्वित किया जाता है। एनिमेशन इमेजमिक्स के साथ बनाए गए हैं जो कई फ्रेमों से परिवर्तित होते हैं - प्रोग्राम स्वयं ही स्टैटिक इमेज को आउटपुट करेगा। कोड नीचे है।

अब: (अगस्त 13, ~ 13: 00 CEST)

उत्पादन

एक दिन: (1 जनवरी)

एक दिन

एक वर्ष: (12:00 यूटीसी)

एक साल

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);\
                                         }

बहुत सुन्दर! मुझें यह पसंद है।
वांडर नौटा

18

आर: ggplot2 और मानचित्र प्रक्षेपण का उपयोग करना

यहाँ छवि विवरण दर्ज करें

@ Mniip की पोस्ट से प्रेरित होकर, मैंने R के mapproj पैकेज का उपयोग करने का प्रयास करने का फैसला किया, जिसमें हम यह अनुमान लगाकर दुनिया को उन्मुख कर सकते हैं कि प्रक्षेपण की गणना करते समय उत्तरी ध्रुव कहाँ होना चाहिए।

वर्तमान जीएमटी समय के आधार पर, मैं देशांतर की गणना करता हूं कि यह वर्तमान में दोपहर कहां है और उस बिंदु को मानचित्र का केंद्र बनाते हैं। हम पृथ्वी को "सूर्य के दृष्टिकोण से" देख रहे हैं इसलिए जो कुछ भी दिखाई दे रहा है वह दिन के उजाले में है।

अधिकांश कोड सिर्फ सौंदर्यशास्त्र है। मुझे केवल यह पता लगाना था कि "दोपहर देशांतर" की गणना किस देशांतर में की जाती है, जहाँ दोपहर के समय कोई जीएमटी दिया गया था।

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

फिर मैंने 24 चित्र बनाने के लिए R एनीमेशन पैकेज का उपयोग किया और उन्हें एक GIF में सिले किया।


अच्छा लग रहा है! क्या यह सही ढंग से गर्मी और सर्दी को संभालता है, हालांकि? मैं R को अच्छी तरह से नहीं जानता, लेकिन ऐसा लगता है कि आपका भूमध्य रेखा हमेशा छवि के केंद्र में है।
वांडर नौटा

हाँ आप सही हैं। मैंने भूमध्य रेखा का एकमात्र अक्षांश के रूप में उपयोग करके त्वरित और गंदा कार्यान्वयन किया। (इसके बजाय एनीमेशन पर ध्यान केंद्रित किया गया।) परियोजना में बहुत सारी विशेषताएं हैं जो मैं उपयोग नहीं कर रहा हूं। यदि एक संदर्भ है जो दिखाता है कि मौसम के साथ अक्षांशों को कैसे अलग किया जाए, तो मुझे इसे आज़माने में खुशी होगी।
राम नरसिम्हन

यहाँ आर, राम में एक संदर्भ है - वास्तव में यह वह जगह है जहाँ मैंने अपनी प्रविष्टि में सूत्र का अनुवाद stackoverflow.com/questions/8708048// से किया है
bazzargh

@bazzargh धन्यवाद! ऐसा लगता है कि मेरे पास करने के लिए अज़ीमुथ कोण के बारे में बहुत कुछ है।
राम नरसिम्हन

9

जावास्क्रिप्ट - मार्टिन क्लेपी ( http://aem1k.com/ ) द्वारा

मैं इस बात पर जोर देना चाहता हूं कि यह मेरा काम नहीं है, बल्कि मार्टिन क्लेपी का काम है। मुझे लगता है कि यह पूरी तरह से फिट बैठता है कि यह यहाँ गायब नहीं होना चाहिए:

ऑनलाइन डेमो (या बस इसे कंसोल में पेस्ट करें)

eval(z='p="<"+"pre>"/*        ######## */;for(y in n="zw24l6k\
4e3t4jnt4qj24xh2 x/*    *############### */42kty24wrt413n243n\
9h243pdxt41csb yz/*  #################### */43iyb6k43pk7243nm\
r24".split(4)){/*     *#################*   */for(a in t=pars\
eInt(n[y],36)+/*          ###############*   */(e=x=r=[]))for\
(r=!r,i=0;t[a/*               ############*   */]>i;i+=.05)wi\
th(Math)x-= /*                #############    */.05,0<cos(o=\
new Date/1e3/*                #########*       */-x/PI)&&(e[~\
~(32*sin(o)*/*                     ####*       */sin(.5+y/7))\
+60] =-~ r);/*                         *###    */for(x=0;122>\
x;)p+="   *#"/*                        #####  */[e[x++]+e[x++\
]]||(S=("eval"/*                      *##### */+"(z=\'"+z.spl\
it(B = "\\\\")./*      ###*           ####  */join(B+B).split\
(Q="\'").join(B+Q/*                  ###* */)+Q+")//m1k")[x/2\
+61*y-1]).fontcolor/*               ##   */(/\\w/.test(S)&&"#\
03B");document.body.innerHTML=p+=B+"\\n"}setTimeout(z)')//m1k\

2
यदि यह आपका काम नहीं है, तो आपको अपना जवाब एक सामुदायिक विकि में बदलना चाहिए।
काइल कानोस

1
टिप के लिए धन्यवाद, उस चेकबॉक्स पर पहले कभी ध्यान नहीं दिया गया। किया हुआ!
इंगो बुर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.