Birkaç dilde uyguladığım ve ESRI'nın kullandığına (üzgünüm, bu sayfada başka bir yerde adı geçen Jenson ve Domingue dışında referans yok) inanıyorum, kullanıcı tarafından sağlanan bir "akma noktası" hücresinde veya hücresinde başlamak akış yönü ızgarasının (fdr) kenarında, mevcut hücreye doğrudan akıştan hangisinin olduğunu bulmak için sekiz komşusunu inceleyin ve bu hücreleri çıktı ızgarasındaki mevcut "havzaya" atayın. Daha sonra fonksiyon, her bir komşu için kendini tekrar tekrar çağırır. Bu işlem, sızan tüm hücreler bir akma noktası için tükenene kadar tekrarlanır ve daha sonra tüm akma noktaları için tekrarlanır.
Özyinelemeli algoritma tasarımı oldukça pahalı olabilir, çünkü bellekte çok fazla veri tutmaya, diske takas / sayfa yerleştirmeye ve bu nedenle genellikle g / ç yavaşlamalarına maruz kalabilir.
(RYO yapacaksanız, farklı özyineleme yöntemleri hakkında aşağıdaki whuber'in yorumuna bakın)
_____________ DÜZENLE _____________
Örnek olarak eski C kodumu kazdık (not: Çoğu piton odadan kaçmak isteyebilir, ancak çok kötü olmamalıdır). Örneklemenin ilgi çekici olabileceğini düşündüm. Artık sadece w / genişliğine birinci derinliği ilk özyineleme vs yüzeysel tanıdık olmama rağmen, benim rutin gerçekten derinliği ilk (ve benim doğal dil açıklaması yukarıda yanıltıcı olduğunu) dayalı olduğunu düşünüyorum bu stackoverflow gönderme umarım (@ whuber veya benden daha akıllı başka bir kişi onaylayabilir / reddedebilir).
Kod: açıklama: idir
akış yönü değerlerinin rasteridir. offset
"Hücre" terimi, halihazırda analiz edilen merkez hücreyi ifade off
eder ve bu hücrenin komşularının her birini kontrol eder. Bu does_it_flow_into_me
, komşu hücrenin flowdir değerinin geçerli hücreyi gösterip göstermediğine dair bir boole döndüren başka bir işlev çağırır . Bir komşu için doğruysa, o yere gidebilirsiniz.
void shed(int init_x, int init_y, int basin_id){
int i, j, offset, off, flow_dir;
offset = ((init_y - 1) * nc) + (init_x - 1);
*(basin + offset) = basin_id;
/* kernel analysis */
for (i = -1; i < 2; i++) {
for (j = -1; j < 2; j++) {
if ((i) || (j)) {
off = offset + (j * nc + i);
flow_dir = *(idir + off);
if (does_it_flow_into_me(i,j,flow_dir)){
shed(init_x+i, init_y+j,basin_id);
}
} /*not center */
} /* do - j */
} /* do - i */
}