วิธีที่รวดเร็วและสกปรกคือการวาดเงาของหลังคาอาคารเท่านั้นทำให้เป็นสีเทาเข้ม (ควรมีกึ่งโปร่งแสงถ้ามีชั้นใต้ดิน) และวาดรูปหลายเหลี่ยมของอาคาร หลังคาเงานั้นได้มาจากการแปลรูปหลายเหลี่ยมของอาคารโดยระยะทางที่กำหนดโดยความสูงของอาคารในทิศทางที่กำหนดโดยที่ราบสูงและความสูงของแหล่งกำเนิดแสง (ถือว่าอยู่ไกลสุดสายตา) (สูตรการคำนวณจำนวนเงินจะปรากฏด้านล่าง)
สิ่งนี้มีแนวโน้มที่จะทำงานได้ดียกเว้นอาคารสูงหรืออาคารสูง (เช่นตึกระฟ้า): ดูว่าเงาของอาคารสูงที่แยกได้ทางด้านขวามือแยกออกจากตัวอาคารอย่างไร
ในการเชื่อมต่อเงากับอาคารได้อย่างถูกต้องคุณต้องรวมเงาของกำแพงอาคาร ไม่ยากที่จะทำ เงาของกำแพงที่ขยายระหว่างจุดที่ตั้งอยู่ที่ P และอีกจุดหนึ่งที่ตั้งอยู่ที่ Q จะเป็นรูปสี่เหลี่ยมขนมเปียกปูนโดย {P, Q, Q ', P'} โดยที่ Q 'เป็นเงาของ Q และ P' คือเงาของ P. อาคารรูปหลายเหลี่ยมจะเป็นการรวมกันของรูปหลายเหลี่ยมที่เชื่อมต่อซึ่งแสดงด้วยลำดับของจุดปิด (P (1), P (2), ... , P (n)) สำหรับรูปหลายเหลี่ยมดังกล่าวให้สร้างเงาของขอบ (P (1), P (2)), (P (2), P (3)), ... , (P (n), P ( 1)) นี่เป็นเรื่องง่ายที่จะทำโดยใช้วิธีวนรอบขอบ
สำหรับแสงที่มุมราบหนึ่งองศา (ทิศตะวันออกเฉียงเหนือ) และระดับความสูงs (จากขอบฟ้า) เงาของจุด P ที่มีพิกัดฉาย (x, y) และความสูงh (ทั้งหมดแสดงในหน่วยเดียวกัน เช่นเมตร) ตั้งอยู่ที่ P '= (x - h sin (a) / tan (s), y - h cos (a) / tan (s) คุณต้องคำนวณ sin (a) / tan (s) และ cos (a) / tan (s) หนึ่งครั้งสำหรับเลเยอร์ทั้งหมดและสำหรับแต่ละรูปหลายเหลี่ยมคุณต้องคูณปัจจัยเหล่านั้นด้วยความสูงเพียงครั้งเดียวเพื่อให้ได้ค่าออฟเซ็ตสำหรับ แต่ละจุดเงาในรูปหลายเหลี่ยม (เวิร์กโหลดการคำนวณที่แท้จริงนั้นดำเนินการโดย GIS ไม่ใช่รหัสของคุณเนื่องจากเป็นรูปแบบสหภาพของรูปสี่เหลี่ยมทั้งสี่เหล่านี้)
นี่คือตัวอย่างของผลกระทบ (ราบและระดับความสูงมีการเปลี่ยนแปลงเล็กน้อยเมื่อเทียบกับรูปแรก แต่รูปหลายเหลี่ยมอาคารและความสูง - ซึ่งแตกต่างกัน - เป็นเหมือนก่อนหน้านี้)
ภาคผนวก
ในการตอบกลับคำขอนี่คือรหัสที่ใช้ในการสร้างตัวอย่างที่สอง แม้ว่าแทบจะไม่มีใครใช้ภาษานี้ (อเวนิว) อีกต่อไป แต่ก็สามารถใช้เป็นรหัสเทียมสำหรับการสร้างโซลูชันใน GIS ที่คุณชื่นชอบ (ซึ่งแตกต่างจากรหัสเทียมส่วนใหญ่ แต่มันได้รับการทดสอบโดยใช้งานจริง :-) มันง่ายมากที่ไม่จำเป็นต้องมีคำอธิบายใด ๆ เพิ่งทราบว่าการสร้างดัชนีเริ่มต้นด้วย 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