📄 shapes2grid.cpp
字号:
}
if( m_pLock->asInt(x, y) != m_Lock_ID )
{
m_pLock ->Set_Value(x, y, m_Lock_ID);
m_pGrid ->Set_Value(x, y, m_pGrid->is_NoData(x, y) ? m_Value : (m_Value + m_pGrid->asDouble(x, y)) / 2.0);
}
}
else
{
m_pGrid ->Set_Value(x, y, m_pGrid->is_NoData(x, y) ? m_Value : (m_Value + m_pGrid->asDouble(x, y)) / 2.0);
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CShapes2Grid::Set_Points(CSG_Shape *pShape)
{
for(int iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
for(int iPoint=0; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
TSG_Point p = pShape->Get_Point(iPoint, iPart);
Set_Value(
(int)(0.5 + X_WORLD_TO_GRID(p.x)),
(int)(0.5 + Y_WORLD_TO_GRID(p.y))
);
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CShapes2Grid::Set_Line(CSG_Shape *pShape)
{
TSG_Point a, b;
for(int iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
b = pShape->Get_Point(0, iPart);
b.x = X_WORLD_TO_GRID(b.x);
b.y = Y_WORLD_TO_GRID(b.y);
for(int iPoint=1; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
a = b;
b = pShape->Get_Point(iPoint, iPart);
b.x = X_WORLD_TO_GRID(b.x);
b.y = Y_WORLD_TO_GRID(b.y);
switch( m_Method_Lines )
{
case 0: Set_Line_A(a, b); break;
case 1: Set_Line_B(a, b); break;
}
}
}
}
//---------------------------------------------------------
void CShapes2Grid::Set_Line_A(TSG_Point a, TSG_Point b)
{
double ix, iy, sig;
double dx, dy;
TSG_Point_Int A, B;
A.x = (int)(a.x += 0.5);
A.y = (int)(a.y += 0.5);
B.x = (int)(b.x += 0.5);
B.y = (int)(b.y += 0.5);
//-----------------------------------------------------
if( A.x != B.x || A.y != B.y )
{
dx = b.x - a.x;
dy = b.y - a.y;
if( fabs(dx) > fabs(dy) )
{
sig = dx < 0 ? -1 : 1;
dx = fabs(dx);
dy /= dx;
for(ix=0; ix<=dx; ix++, a.x+=sig, a.y+=dy)
{
Set_Value((int)a.x, (int)a.y);
}
}
else if( fabs(dy) >= fabs(dx) && dy != 0 )
{
sig = dy < 0 ? -1 : 1;
dy = fabs(dy);
dx /= dy;
for(iy=0; iy<=dy; iy++, a.x+=dx, a.y+=sig)
{
Set_Value((int)a.x, (int)a.y);
}
}
}
else
{
Set_Value(A.x, A.y);
}
}
/*/---------------------------------------------------------
void CShapes2Grid::Set_Line_A(TSG_Point a, TSG_Point b)
{
TSG_Point_Int A, B;
A.x = (int)(a.x + 0.5);
A.y = (int)(a.y + 0.5);
B.x = (int)(b.x + 0.5);
B.y = (int)(b.y + 0.5);
//-----------------------------------------------------
if( A.x != B.x || A.y != B.y )
{
int d, dx, dy;
double m, t;
dx = B.x - A.x;
dy = B.y - A.y;
if( fabs(dx) > fabs(dy) )
{
d = dx < 0 ? -1 : 1;
m = d * (double)dy / (double)dx;
for(t=A.y; A.x!=B.x; A.x+=d, t+=m)
{
Set_Value(A.x, (int)t);
}
}
else // if( fabs(dy) >= fabs(dx) )
{
d = dy < 0 ? -1 : 1;
m = d * (double)dx / (double)dy;
for(t=A.x; A.y!=B.y; A.y+=d, t+=m)
{
Set_Value((int)t, A.y);
}
}
}
else
{
Set_Value(A.x, A.y);
}
}/**/
//---------------------------------------------------------
void CShapes2Grid::Set_Line_B(TSG_Point a, TSG_Point b)
{
int ix, iy;
double e, d, dx, dy;
TSG_Point_Int A, B;
A.x = (int)(a.x += 0.5);
A.y = (int)(a.y += 0.5);
B.x = (int)(b.x += 0.5);
B.y = (int)(b.y += 0.5);
Set_Value(A.x, A.y);
//-----------------------------------------------------
if( A.x != B.x || A.y != B.y )
{
dx = b.x - a.x;
dy = b.y - a.y;
a.x = a.x > 0.0 ? a.x - (int)a.x : 1.0 + (a.x - (int)a.x);
a.y = a.y > 0.0 ? a.y - (int)a.y : 1.0 + (a.y - (int)a.y);
//-------------------------------------------------
if( fabs(dx) > fabs(dy) )
{
ix = dx > 0.0 ? 1 : -1;
iy = dy > 0.0 ? 1 : -1;
d = fabs(dy / dx);
dx = ix < 0 ? a.x : 1.0 - a.x;
e = iy > 0 ? a.y : 1.0 - a.y;
e += d * dx;
while( e > 1.0 )
{
e -= 1.0;
A.y += iy;
Set_Value(A.x, A.y);
}
while( A.x != B.x )
{
A.x += ix;
e += d;
Set_Value(A.x, A.y);
if( A.x != B.x )
{
while( e > 1.0 )
{
e -= 1.0;
A.y += iy;
Set_Value(A.x, A.y);
}
}
}
if( A.y != B.y )
{
iy = A.y < B.y ? 1 : -1;
while( A.y != B.y )
{
A.y += iy;
Set_Value(A.x, A.y);
}
}
}
//-------------------------------------------------
else // if( fabs(dy) > fabs(dx) )
{
ix = dx > 0.0 ? 1 : -1;
iy = dy > 0.0 ? 1 : -1;
d = fabs(dx / dy);
dy = iy < 0 ? a.y : 1.0 - a.y;
e = ix > 0 ? a.x : 1.0 - a.x;
e += d * dy;
while( e > 1.0 )
{
e -= 1.0;
A.x += ix;
Set_Value(A.x, A.y);
}
while( A.y != B.y )
{
A.y += iy;
e += d;
Set_Value(A.x, A.y);
if( A.y != B.y )
{
while( e > 1.0 )
{
e -= 1.0;
A.x += ix;
Set_Value(A.x, A.y);
}
}
}
if( A.x != B.x )
{
ix = A.x < B.x ? 1 : -1;
while( A.x != B.x )
{
A.x += ix;
Set_Value(A.x, A.y);
}
}
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CShapes2Grid::Set_Polygon(CSG_Shape *pShape)
{
bool bFill, *bCrossing;
int x, y, xStart, xStop;
TSG_Point A, B, a, b, c;
CSG_Rect Extent;
//-----------------------------------------------------
bCrossing = (bool *)SG_Malloc(m_pGrid->Get_NX() * sizeof(bool));
Extent = pShape->Get_Extent();
xStart = (int)((Extent.m_rect.xMin - m_pGrid->Get_XMin()) / m_pGrid->Get_Cellsize()) - 1;
if( xStart < 0 )
xStart = 0;
xStop = (int)((Extent.m_rect.xMax - m_pGrid->Get_XMin()) / m_pGrid->Get_Cellsize()) + 1;
if( xStop >= m_pGrid->Get_NX() )
xStop = m_pGrid->Get_NX() - 1;
A.x = m_pGrid->Get_XMin() - 1.0;
B.x = m_pGrid->Get_XMax() + 1.0;
//-----------------------------------------------------
for(y=0, A.y=m_pGrid->Get_YMin(); y<m_pGrid->Get_NY(); y++, A.y+=m_pGrid->Get_Cellsize())
{
if( A.y >= Extent.m_rect.yMin && A.y <= Extent.m_rect.yMax )
{
B.y = A.y;
memset(bCrossing, 0, m_pGrid->Get_NX() * sizeof(bool));
for(int iPart=0; iPart<pShape->Get_Part_Count(); iPart++)
{
b = pShape->Get_Point(pShape->Get_Point_Count(iPart) - 1, iPart);
for(int iPoint=0; iPoint<pShape->Get_Point_Count(iPart); iPoint++)
{
a = b;
b = pShape->Get_Point(iPoint, iPart);
if( ((a.y <= A.y && A.y < b.y)
|| (a.y > A.y && A.y >= b.y)) )
{
SG_Get_Crossing(c, a, b, A, B, false);
x = (int)(1.0 + X_WORLD_TO_GRID(c.x));
if( x < 0 )
{
x = 0;
}
else if( x >= m_pGrid->Get_NX() )
{
x = m_pGrid->Get_NX() - 1;
}
bCrossing[x] = !bCrossing[x];
}
}
}
//---------------------------------------------
for(x=xStart, bFill=false; x<=xStop; x++)
{
if( bCrossing[x] )
{
bFill = !bFill;
}
if( bFill )
{
Set_Value(x, y);
}
}
}
}
//-----------------------------------------------------
SG_Free(bCrossing);
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -