Hızlı ve kirli bir yöntem sadece bina çatılarının gölgelerini çizmek, onları koyu gri yapmak (tercihen altta yatan zemin katmanları varsa yarı saydam) ve bina çokgenlerini üzerlerine çizmektir. Çatı gölgeleri, bina çokgenlerinin, bina yükseklikleri tarafından belirlenen ışık kaynağının azimutu ve rakımı (sonsuz uzakta olduğu düşünülen) tarafından belirlenen yönde çevrilerek elde edilir. (Çeviri miktarı için bir formül aşağıda görünür.)
Bu, düşük rakımlar veya yüksek binalar (gökdelenler gibi) dışında iyi çalışma eğilimindedir: sağ taraftaki daha uzun izole binaların gölgelerinin binalardan nasıl ayrıldığını görün.
Gölgeleri binalara düzgün bir şekilde bağlamak için , bina duvarlarının gölgelerini eklemeniz gerekir . Bunu yapmak zor değil. P'de bulunan bir nokta ile Q'da bulunan başka bir nokta arasında uzanan duvarın gölgesi, {P, Q, Q ', P'} ile özetlenen dörtgen olacaktır; burada Q ', Q'nun ve P' nin gölgesi Çokgen bir bina, kapalı nokta dizileri (P (1), P (2), ..., P (n)) ile temsil edilen bağlı çokgenlerin bir koleksiyonu olacaktır. Bu tür çokgenler için, kenarların (P (1), P (2)), (P (2), P (3)), ..., (P (n), P ( 1)). Bu, kenarlar üzerinde bir ilmek vasıtasıyla yapılması kolaydır.
Bir derece azimutunda (kuzey doğusunda) ve s derecesinde (ufuktan) bir ışık için , öngörülen koordinatları (x, y) ve yüksekliği h olan (tümü aynı birimlerde ifade edilen ) bir P noktasının gölgesi , örneğin metre) P '= (x - h sin (a) / tan (lar), y - h cos (a) / tan (lar)) konumunda bulunur. Tüm katman için sin (a) / tan (s) ve cos (a) / tan (s) değerlerini yalnızca bir kez hesaplamanız gerekir ve her çokgen için ofsetleri elde etmek için bu faktörleri yükseklikle yalnızca bir kez çarpmanız gerekir. çokgendeki her nokta gölgesi. (Gerçek hesaplamalı iş yükü, tüm bu dörtgenlerin birliğini oluşturduğu için kodunuz değil, CBS tarafından taşınır.)
Etkinin bir örneği. (Azimut ve rakım ilk rakama göre biraz değişti, ancak bina çokgenleri ve yükseklikleri - değişkenlik - eskisi gibi.
apandis
Bir isteğe yanıt olarak, ikinci örneği oluşturmak için kullanılan kod aşağıdadır. Artık neredeyse hiç kimse bu dili (Avenue) kullanmasa da, en sevdiğiniz CBS'de bir çözüm oluşturmak için sözde kod olarak kullanılabilir. (Çoğu sahte kodun aksine, aslında çalıştırılarak test edilmiştir. :-) Çok basit bir açıklama gerekmeyecek; dizine eklemenin 1 değil 0 ile başladığını ve çokgen halkalarının açıkça kapalı olduğunu unutmayın (listedeki son nokta ilk nokta ile çakışır).
' 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