एक त्वरित और गंदी विधि केवल भवन की छतों की छाया खींचने के लिए है, उन्हें गहरे भूरे रंग में प्रस्तुत करना (अधिमानतः अर्ध-पारदर्शी अगर कोई अंतर्निहित जमीन की परतें हैं), और उनके ऊपर इमारत बहुभुज बनाएं। छत की परछाइयों को बिल्डिंग पॉलीगनों द्वारा भवन की ऊँचाई द्वारा निर्धारित दिशाओं द्वारा अनुवाद करके प्राप्त किया जाता है, जो कि अज़ीमथ द्वारा स्थापित दिशा और प्रकाश स्रोत की ऊँचाई (असीम रूप से दूर माना जाता है) की ऊँचाई से होती है। (अनुवाद की राशि के लिए एक सूत्र नीचे दिखाई देता है।)
यह कम ऊंचाई या ऊंची इमारतों (जैसे गगनचुंबी इमारतों) को छोड़कर ठीक काम करने के लिए जाता है: देखें कि कैसे दाहिने हाथ की तरफ ऊंची इमारतों की छाया खुद इमारतों से अलग हो जाती है।
इमारतों से छाया को ठीक से जोड़ने के लिए , आपको भवन की दीवारों की छाया को शामिल करना होगा । यह करना मुश्किल नहीं है। P पर स्थित बिंदु के बीच फैली हुई दीवार की छाया और Q पर स्थित एक अन्य बिंदु {P, Q, Q ', P'} द्वारा उल्लिखित चतुर्भुज होगा जहां Q 'Q और P' की छाया है। पी। एक बहुभुज निर्माण बिंदु के बंद अनुक्रमों (पी (1), पी (2), ..., पी (एन) से जुड़े पॉलीगोन का एक संग्रह होगा। ऐसे प्रत्येक बहुभुज के लिए, किनारों की छाया (P (1), P (2)), (P (2), P (3)), ..., (P (n), P () 1))। यह किनारों पर एक लूप के माध्यम से करने के लिए सीधा है।
एक डिग्री (उत्तर के पूर्व) और एस डिग्री (क्षितिज से) की ऊंचाई पर एक प्रकाश के लिए , अनुमानित निर्देशांक (x, y) और ऊंचाई h (सभी एक ही इकाइयों में व्यक्त ) के साथ एक बिंदु P की छाया। , जैसे कि मीटर) P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s)) पर स्थित है। आपको संपूर्ण परत के लिए केवल एक बार पाप (ए) / टैन (एस) और कॉस (ए) / टैन (एस) की गणना करनी होगी, और प्रत्येक बहुभुज के लिए आपको केवल एक बार ऑफसेट प्राप्त करने के लिए उन कारकों को ऊंचाई से गुणा करना होगा। बहुभुज में प्रत्येक बिंदु छाया। (वास्तविक कम्प्यूटेशनल कार्यभार जीआईएस द्वारा लिया गया है, न कि आपका कोड, क्योंकि यह इन सभी चतुर्भुजों के संघों का निर्माण करता है।)
यहाँ प्रभाव का एक उदाहरण है। (पहले आंकड़े की तुलना में अज़ीमुथ और ऊंचाई में थोड़ा बदलाव आया है, लेकिन इमारत बहुभुज और ऊँचाई - जो बदलती हैं - पहले जैसी ही हैं।)
अनुबंध
एक अनुरोध के जवाब में, यहां दूसरा उदाहरण बनाने के लिए कोड का उपयोग किया गया है। यद्यपि लगभग कोई भी इस भाषा (एवेन्यू) का उपयोग नहीं करता है, यह आपके पसंदीदा जीआईएस में समाधान बनाने के लिए अच्छी तरह से स्यूडोकोड के रूप में काम कर सकता है। (अधिकांश स्यूडोकोड के विपरीत, हालांकि, वास्तव में इसे चलाने के द्वारा परीक्षण किया गया है। :-) यह इतना सरल है कि किसी स्पष्टीकरण की आवश्यकता नहीं होनी चाहिए; बस ध्यान रखें कि अनुक्रमण 0 से शुरू होता है, 1 से नहीं, और यह कि बहुभुज के छल्ले स्पष्ट रूप से बंद हैं (सूची में अंतिम बिंदु पहले बिंदु के साथ मेल खाता है)।
' S
' Return the shadow of a shape.
' Field calculator example:
' av.run("S", {[shape], [height], 200, 35})
'======================================================================'
theShape = SELF.Get(0) ' A projected polygon
xHeight = SELF.Get(1) ' Expressed in the projected units
xAzimuth = SELF.Get(2).AsRadians ' Any angle (in degrees) east of north
xAltitude = SELF.Get(3).AsRadians ' Angle between 0 and 90 (vertical)
'
' Compute the shadow offsets.
'
xSpread = 1/xAltitude.Tan
x = -xHeight * xSpread * xAzimuth.Sin
y = -xHeight * xSpread * xAzimuth.Cos
xy = x@y
'
' Begin with the original shape.
'
p = theShape.Clone
'
' Adjoin the wall shadows.
'
for each lPts in theShape.AsList ' Loop over the rings
for each i in 1..(lPts.Count-1) ' Loop over edges in this ring
l = {lPts.Get(i-1), lPts.Get(i), lPts.Get(i)+xy, lPts.Get(i-1)+xy}
p = p.ReturnUnion(Polygon.Make({l}))
end
end
return p
' end of script