首先要有水流方向矩阵Direction[,](只写了单一流向的算法,因此水流方向矩阵只有1,2,4,8,16,32,64,128八个值)。
首先是主函数
public int[,] Accumulation(int[,] Direction)
{
int i, j;
int[,] result = new int[Direction.GetLength(0), Direction.GetLength(1)];
Boolean[,] Origin = CalOrigin(Direction);//计算是否是水流源点
Boolean[,] OutFlow = CalOut(Direction);//计算是否是水流出点
for (i = 0; i < Direction.GetLength(0); i++)
{
for (j = 0; j < Direction.GetLength(1); j++)
{
if (OutFlow[i, j] == true)
{
Add(Direction, Origin, result, i, j);//累加函数,采用回溯法
}
}
}
return result;
}
计算水流源点的函数
private Boolean[,] CalOut(int[,] Direction)
{
int i, j;
Boolean[,] flag = new Boolean[Direction.GetLength(0), Direction.GetLength(1)];
for (j = 0; j < Direction.GetLength(1); j++)
{
i = 0;
if (Direction[i, j] >= 32)
{
flag[i, j] = true;
}
else
{