//--------------------------------------------------------- void CFlow_Parallel::Set_BRM( int x, int y ) { int Dir, QBinaer, ix[3], iy[3], nexp[6]; double QLinks, QMitte, QRecht, nnei[6]; //----------------------------------------------------- if( is_InGrid(x, y, 1) ) // Rand !!! { Dir = BRM_InitRZ(x,y,ix,iy); if( Dir >= 0 ) { if( Dir % 2 ) { BRM_GetDiago(Dir,x,y,ix,iy,nnei,nexp); BRM_QStreuung(4,1,nnei,nexp,QBinaer,QLinks,QMitte,QRecht); } else { BRM_GetOrtho(Dir,x,y,ix,iy,nnei,nexp); BRM_QStreuung(6,0,nnei,nexp,QBinaer,QLinks,QMitte,QRecht); } Add_Fraction(x,y,(Dir+1)%8,BRM_BitMtrx[0][QBinaer] ? QLinks : 0); Add_Fraction(x,y,(Dir+0)%8,BRM_BitMtrx[1][QBinaer] ? QMitte : 0); Add_Fraction(x,y,(Dir+7)%8,BRM_BitMtrx[2][QBinaer] ? QRecht : 0); } } }
//--------------------------------------------------------- void CFlow_RecursiveUp::Get_Flow(int x, int y) { int i, ix, iy, j; double jFlow; if( !is_Locked(x,y) ) { Lock_Set(x,y); Init_Cell(x,y); for(i=0, j=4; i<8; i++, j=(j+1)%8) { ix = Get_xTo(i,x); iy = Get_yTo(i,y); if( is_InGrid(ix,iy) ) { jFlow = Flow[iy][ix][j]; if( jFlow > 0 ) { Get_Flow(ix,iy); Add_Fraction(ix,iy,j,jFlow); } } } } }
//--------------------------------------------------------- void CFlow_Parallel::Set_MFD(int x, int y) { int i, ix, iy; double z, d, dzSum, dz[8]; //----------------------------------------------------- for(i=0, dzSum=0.0, z=m_pDTM->asDouble(x, y); i<8; i++) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( m_pDTM->is_InGrid(ix, iy) ) { d = z - m_pDTM->asDouble(ix, iy); } else { ix = Get_xTo(i + 4, x); iy = Get_yTo(i + 4, y); if( m_pDTM->is_InGrid(ix, iy) ) { d = m_pDTM->asDouble(ix, iy) - z; } else { d = 0.0; } } if( d > 0.0 ) { dzSum += (dz[i] = pow(d / Get_Length(i), m_Converge)); } else { dz[i] = 0.0; } } //----------------------------------------------------- if( dzSum > 0.0 ) { for(i=0; i<8; i++) { if( dz[i] > 0.0 ) { Add_Fraction(x, y, i, dz[i] / dzSum); } } } }
//--------------------------------------------------------- void CFlow_Parallel::Set_DInf(int x, int y) { double s, a; if( m_pDTM->Get_Gradient(x, y, s, a) && a >= 0.0 ) { int i, ix, iy; i = (int)(a / M_PI_045); a = fmod (a , M_PI_045) / M_PI_045; s = m_pDTM->asDouble(x, y); if( m_pDTM->is_InGrid(ix = Get_xTo(i + 0, x), iy = Get_yTo(i + 0, y)) && m_pDTM->asDouble(ix, iy) < s && m_pDTM->is_InGrid(ix = Get_xTo(i + 1, x), iy = Get_yTo(i + 1, y)) && m_pDTM->asDouble(ix, iy) < s ) { Add_Fraction(x, y, i , 1.0 - a); Add_Fraction(x, y, (i + 1) % 8, a); return; } } Set_D8(x, y); }
//--------------------------------------------------------- void CFlow_Parallel::Set_Rho8(int x, int y) { int iMax = -1; double dMax, z = m_pDTM->asDouble(x, y); for(int i=0; i<8; i++) { int ix = Get_xTo(i, x); int iy = Get_yTo(i, y); if( !m_pDTM->is_InGrid(ix, iy) ) { return; } else { double d = z - m_pDTM->asDouble(ix, iy); if( i % 2 == 1 ) { d /= 1.0 + rand() / (double)RAND_MAX; } if( iMax < 0 || dMax < d ) { iMax = i; dMax = d; } } } if( iMax >= 0 ) { Add_Fraction(x, y, iMax); } }
//--------------------------------------------------------- void CFlow_Parallel::Set_MDInf(int x, int y) { int i, ix, iy; double dz[8], s_facet[8], r_facet[8], valley[8], portion[8]; bool bInGrid[8]; //----------------------------------------------------- double z = m_pDTM->asDouble(x, y); for(i=0; i<8; i++) { s_facet[i] = r_facet[i] = -999.0; ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( (bInGrid[i] = m_pDTM->is_InGrid(ix, iy)) ) { dz[i] = z - m_pDTM->asDouble(ix, iy); } else { dz[i] = 0.0; } } //----------------------------------------------------- for(i=0; i<8; i++) { double hs = -999.; double hr = -999.; if( bInGrid[i] ) { int j = i < 7 ? i + 1 : 0; if( bInGrid[j] ) { double nx = (dz[j] * Get_yTo(i) - dz[i] * Get_yTo(j)) * Get_Cellsize(); // vb-code: nx = (z1 * yd(j) - z2 * yd(i)) * gridsize /*ERROR?*/ double ny = (dz[i] * Get_xTo(j) - dz[j] * Get_xTo(i)) * Get_Cellsize(); // vb-code: ny = (z1 * xd(j) - z2 * xd(i)) * gridsize double nz = (Get_xTo(i) * Get_yTo(j) - Get_xTo(j) * Get_yTo(i)) * Get_Cellarea(); // vb-code: nz = (xd(j) * yd(i) - xd(i) * yd(j)) * gridsize ^ 2 double n_norm = sqrt(nx*nx + ny*ny +nz*nz); /* if( nx == 0.0 ) { hr = (ny >= 0.0)? 0.0 : M_PI; } else if( nx > 0.0 ) { hr = M_PI_090 - atan(ny / nx); } else { hr = M_PI_270 - atan(ny / nx); } */ if( nx == 0.0 ) { hr = (ny >= 0.0)? 0.0 : M_PI; } else if( nx < 0.0 ) { hr = M_PI_270 - atan(ny / nx); } else { hr = M_PI_090 - atan(ny / nx); } hs = -tan( acos( nz/n_norm ) ); // vb-code: hs = -Tan(arccos(nz / betrag_n)) // vb-code: If hr <= (i - 1) * PI / 4 Or hr >= i * PI / 4 Then //SHOULD IT BE LIKE THIS: (( hr <= i * M_PI_045 || hr >= j * M_PI_045 ) OR AS BELOW??? if( hr < i * M_PI_045 || hr > (i+1) * M_PI_045 ) { if( dz[i] > dz[j] ) { hr = i * M_PI_045; hs = dz[i] / Get_Length(i); } else { hr = j * M_PI_045; hs = dz[j] / Get_Length(j); } } } else if( dz[i] > 0.0 ) { hr = i * M_PI_045; hs = dz[i] / Get_Length(i); } s_facet[i] = hs; r_facet[i] = hr; } } //----------------------------------------------------- double dzSum = 0.0; for(i=0; i<8; i++) { valley[i] = 0.0; int j = i < 7 ? i + 1 : 0; if( s_facet[i] > 0.0 ) { if( r_facet[i] > i * M_PI_045 && r_facet[i] < (i+1) * M_PI_045 ) { valley[i] = s_facet[i]; } else if( r_facet[i] == r_facet[j] ) { valley[i] = s_facet[i]; } else if( s_facet[j] == -999.0 && r_facet[i] == (i+1) * M_PI_045 ) { valley[i] = s_facet[i]; } else { j = i > 0 ? i - 1 : 7; if( s_facet[j] == -999.0 && r_facet[i] == i * M_PI_045 ) { valley[i] = s_facet[i]; } } valley[i] = pow(valley[i], m_Converge); dzSum += valley[i]; } portion[i] = 0.0; } //----------------------------------------------------- if( dzSum ) { for(i=0; i<8; i++) { int j = i < 7 ? i + 1 : 0; if( i >= 7 && r_facet[i] == 0.0 ) { r_facet[i] = M_PI_360; } if( valley[i] ) { valley[i] /= dzSum; portion[i] += valley[i] * ((i+1) * M_PI_045 - r_facet[i]) / M_PI_045; // vb-code: portion(i) = portion(i) + valley(i) * (i * PI / 4 - r_facet(i)) / (PI / 4) portion[j] += valley[i] * (r_facet[i] - (i ) * M_PI_045) / M_PI_045; // vb-code: portion(j) = portion(j) + valley(i) * (r_facet(i) - (i - 1) * PI / 4) / (PI / 4) } } for(i=0; i<8; i++) { Add_Fraction(x, y, i, portion[i]); } } }
//--------------------------------------------------------- void CFlow_Parallel::Set_MMDGFD(int x, int y) { int i, ix, iy; double z, d, dzMax, dzSum, dz[8]; //----------------------------------------------------- for(i=0, dzMax=0.0, z=m_pDTM->asDouble(x, y); i<8; i++) { ix = Get_xTo(i, x); iy = Get_yTo(i, y); if( m_pDTM->is_InGrid(ix, iy) ) { d = z - m_pDTM->asDouble(ix, iy); } else { ix = Get_xTo(i + 4, x); iy = Get_yTo(i + 4, y); if( m_pDTM->is_InGrid(ix, iy) ) { d = m_pDTM->asDouble(ix, iy) - z; } else { d = 0.0; } } if( d > 0.0 ) { dz[i] = d / Get_Length(i); if( dzMax < dz[i] ) { dzMax = dz[i]; } } else { dz[i] = 0.0; } } //----------------------------------------------------- if( dzMax > 0.0 ) { dzMax = dzMax < 1.0 ? 8.9 * dzMax + 1.1 : 10.0; for(i=0, dzSum=0.0; i<8; i++) { if( dz[i] > 0.0 ) { dzSum += (dz[i] = pow(dz[i], dzMax)); } } for(i=0; i<8; i++) { if( dz[i] > 0.0 ) { Add_Fraction(x, y, i, dz[i] / dzSum); } } } }
//--------------------------------------------------------- void CFlow_Parallel::Set_D8(int x, int y, int Direction) { Add_Fraction(x, y, Direction >= 0 ? Direction : m_pDTM->Get_Gradient_NeighborDir(x, y)); }