📄 tin_from_grid_specific_points.cpp
字号:
else
pResult->Set_Value(x,y, 0); // Nichts...
}
}
delete(clo);
delete(chi);
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CTIN_From_Grid_Specific_Points::Get_OppositeNB(CSG_Grid *pResult, CSG_Grid *pGrid, int Threshold)
{
int i, x, y, ix, iy, jx, jy;
double z, iz, jz;
CSG_Grid *clo, *chi;
clo = SG_Create_Grid(pGrid, GRID_TYPE_Char);
chi = SG_Create_Grid(pGrid, GRID_TYPE_Char);
// Pass 1: Auszaehlen...
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX()-1; x++)
{
z = pGrid->asDouble(x,y);
for(i=0; i<4; i++)
{
ix = Get_xTo(i,x);
iy = Get_yTo(i,y);
if( is_InGrid(ix,iy) )
{
jx = Get_xFrom(i,x);
jy = Get_yFrom(i,y);
if( is_InGrid(jx,jy) )
{
iz = pGrid->asDouble(ix,iy);
jz = pGrid->asDouble(jx,jy);
if( iz>z && jz>z )
chi->Add_Value(x,y,1);
else if( iz<z && jz<z )
clo->Add_Value(x,y,1);
}
}
}
}
}
// Pass 2: Setzen...
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX()-1; x++)
{
if( chi->asChar(x,y) )
{
if( clo->asChar(x,y) )
pResult->Set_Value(x,y, 5); // Sattel
else
pResult->Set_Value(x,y, chi->asChar(x,y) ); // Tiefenlinie
}
else if( clo->asChar(x,y) )
pResult->Set_Value(x,y, - clo->asChar(x,y) ); // Wasserscheide
else
pResult->Set_Value(x,y, 0); // Nichts...
pResult->Set_Value(x, y, abs(pResult->asInt(x, y)) >= Threshold ? 1 : 0);
}
}
delete(clo);
delete(chi);
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CTIN_From_Grid_Specific_Points::Get_FlowDirection(CSG_Grid *pResult, CSG_Grid *pGrid, int Min, int Max)
{
bool bLower;
int x, y, i, ix, iy, xLow, yLow;
double z, iz, zLow;
pResult->Assign();
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX(); x++)
{
z = pGrid->asDouble(x,y);
bLower = false;
for(i=0; i<8; i++)
{
ix = Get_xTo(i,x);
iy = Get_yTo(i,y);
if( is_InGrid(ix,iy) )
{
iz = pGrid->asDouble(ix,iy);
if(iz<z)
{
if(!bLower)
{
bLower = true;
zLow = iz;
xLow = ix;
yLow = iy;
}
else if(iz<zLow)
{
zLow = iz;
xLow = ix;
yLow = iy;
}
}
}
}
if(bLower)
{
pResult->Add_Value(xLow, yLow, 1);
}
}
}
for(y=0; y<Get_NY() && Set_Progress(y); y++)
{
for(x=0; x<Get_NX(); x++)
{
i = pResult->asInt(x, y);
if( i <= Min )
{
pResult->Set_Value(x, y, -1);
}
else if( i >= Max )
{
pResult->Set_Value(x, y, 1);
}
else
{
pResult->Set_Value(x, y, 0);
}
}
}
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CTIN_From_Grid_Specific_Points::Get_FlowDirection2(CSG_Grid *pResult, CSG_Grid *pGrid, int Threshold)
{
CSG_Grid Grid(*pGrid), Result(*pResult);
Get_FlowDirection(pResult, &Grid, -1, Threshold);
Grid.Invert();
Get_FlowDirection(&Result, &Grid, -1, Threshold);
for(int n=0; n<Get_NCells(); n++)
{
if( Result.asInt(n) > 0 )
{
pResult->Set_Value(n, 1);
}
}
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CTIN_From_Grid_Specific_Points::Get_Peucker(CSG_Grid *pResult, CSG_Grid *pGrid, double Threshold)
{
bool wasPlus;
int x, y, i, ix, iy, nSgn;
double d, dPlus, dMinus, z, alt[8];
for(y=0; y<pGrid->Get_NY() && Set_Progress(y, pGrid->Get_NY()); y++)
{
for(x=0; x<pGrid->Get_NX(); x++)
{
z = pGrid->asDouble(x,y);
for(i=0; i<8; i++)
{
ix = pGrid->Get_System().Get_xTo(i,x);
iy = pGrid->Get_System().Get_yTo(i,y);
if( pGrid->is_InGrid(ix,iy) )
alt[i] = pGrid->asDouble(ix,iy);
else
alt[i] = z;
}
dPlus = dMinus = 0;
nSgn = 0;
wasPlus = (alt[7] - z > 0) ? true : false;
for(i=0; i<8; i++)
{
d = alt[i] - z;
if(d>0)
{
dPlus += d;
if(!wasPlus)
{
nSgn++;
wasPlus = true;
}
}
else if(d<0)
{
dMinus -= d;
if(wasPlus)
{
nSgn++;
wasPlus = false;
}
}
}
i = 0;
if(!dPlus) // Peak...
i = 9;
else if(!dMinus) // Pit
i = -9;
else if(nSgn==4) // Pass
i = 1;
else if(nSgn==2)
{
i = nSgn = 0;
if(alt[7]>z)
{
while(alt[i++]>z);
do nSgn++; while(alt[i++]<z);
}
else
{
while(alt[i++]<z);
do nSgn++; while(alt[i++]>z);
}
i = 0;
if(nSgn==4)
{
if(dMinus-dPlus > Threshold) // convex break...
i = 2;
else if(dPlus-dMinus > Threshold) // concave break...
i = -2;
}
else // lines:
{
if(dMinus-dPlus>0) // Ridge
i = 7;
else // Channel
i = -7;
}
}
pResult->Set_Value(x, y, i == 0 ? 0 : 1);
}
}
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -