Görüş ışınlarının yerine gölge ışınlarını kullanmayı tercih ederim.
Diyelim ki bu sizin görüş alanınız (potansiyel olarak görülebilir alan)
######################
#####.............####
###................###
##..................##
#....................#
#....................#
#..........@.........#
#....................#
#....................#
##..................##
###................###
#####.............####
######################
# Blokları, görünür durumdayken görünmez. görülebilir
Hadi biraz engel koyalım:
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXXX...........#
##..................##
###....X...........###
#####.............####
######################
Görünüm alanı içinde bulunan X'in bir listesi var, sonra bu engelin arkasındaki her döşemeyi gizli olarak işaretlersiniz: bir engel gizlenmiş olarak işaretlendiğinde, listeden kaldırırsınız.
######################
#####.............####
###................###
##.....X.....XXX....##
#......X.......X.....#
#...X.XX.............#
#...X......@.........#
#...X..........X.....#
#...XXXXX*...........#
##......##..........##
###....*#..........###
#####.###.........####
######################
Yukarıdaki örnekte, en alttaki duvarın sağ tarafından atılan gölgeyi ve bu gölgenin gizli engeli kontrol etmeniz gereken engeller listesinden nasıl sildiğini görebilirsiniz (X kontrol etmeli; * kontrol edilmeli).
Eğer listeyi bazı ikili partitonları kullanarak sıralarsanız, ilk Cosest X kontrol edilirse, kontrolünüzü biraz hızlandırabilirsiniz.
Bir kerede Xs bloğunu kontrol etmek için bir çeşit "Deniz Savaşları" algoritması kullanabilirsiniz (temelde gölge konisini daha geniş hale getirecek yönde olan bir adiacent X arıyorsunuz)
[DÜZENLE]
Düzgün bir gölge elde etmek için iki ışın gerekir ve bir çini dikdörtgen olduğundan, mevcut simetrileri kullanarak birçok varsayım yapılabilir.
Işın koordinatları, engel döşemesinin etrafına bölünen basit bir boşluk kullanılarak hesaplanabilir:
Her dikdörtgen alan, kiremit köşesinin neyin gölge koni kenarı olarak alınması gerektiği konusunda bir seçimdir.
Bu akıl yürütme, birden fazla bitişik fayans bağlamak ve takip eden tek bir daha geniş koni dökmelerini sağlamak için daha fazla itilebilir.
İlk adım, gözlemci yönüne yönelik hiçbir engel bulunmadığından emin olmaktır, bu durumda en yakın engel bunun yerine kabul edilir:
Sarı kiremit bir engelse, o kiremit yeni kırmızı kiremit haline gelir.
Şimdi üst koni kenarını düşünelim:
Mavi kiremitlerin tümü, gölge konisinin daha geniş olmasına izin vermek için olası bir adaydır: en az bir tanesi engel ise, ışın daha önce görüldüğü gibi kiremit etrafındaki alan kullanılarak parlatılabilir.
Yeşil çini yalnızca gözlemci izleyen turuncu çizginin üzerindeyse adaydır:
Aynı şey, diğer ışın ve gözlemcinin kırmızı engel hakkındaki diğer konumları için de geçerlidir.
Temel fikir, her koni dökümü için mümkün olduğu kadar alanı kaplamak ve kontrol edilmesi gereken engeller listesini mümkün olduğu kadar kısaltmaktır.