📄 wksp_tin.cpp
字号:
//---------------------------------------------------------
double CWKSP_TIN::Get_Value_Range(void)
{
if( m_Color_Field >= 0 )
{
return(
m_pTIN->Get_Table().Get_MaxValue(m_Color_Field)
- m_pTIN->Get_Table().Get_MinValue(m_Color_Field)
);
}
else
{
return( 0.0 );
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_TIN::asImage(CSG_Grid *pImage)
{
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CWKSP_TIN::On_Edit_On_Mouse_Up(CSG_Point Point, double ClientToWorld, int Key)
{
CSG_Rect rWorld(m_Edit_Mouse_Down, Point);
if( rWorld.Get_XRange() == 0.0 && rWorld.Get_YRange() == 0.0 )
{
rWorld.Inflate(2.0 * ClientToWorld, false);
}
return( true );
}
//---------------------------------------------------------
bool CWKSP_TIN::On_Edit_Set_Attributes(void)
{
return( true );
}
//---------------------------------------------------------
TSG_Rect CWKSP_TIN::On_Edit_Get_Extent(void)
{
return( m_pTIN->Get_Extent() );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CWKSP_TIN::On_Draw(CWKSP_Map_DC &dc_Map, bool bEdit)
{
if( Get_Extent().Intersects(dc_Map.m_rWorld) != INTERSECTION_None )
{
if( m_Color_Field >= 0 )
{
_Draw_Triangles (dc_Map);
}
if( m_Parameters("DISPLAY_EDGES") ->asBool() )
{
_Draw_Edges (dc_Map);
}
if( m_Parameters("DISPLAY_POINTS") ->asBool() )
{
_Draw_Points (dc_Map);
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CWKSP_TIN::_Draw_Points(CWKSP_Map_DC &dc_Map)
{
int i;
TSG_Point_Int Point;
for(i=0; i<m_pTIN->Get_Point_Count(); i++)
{
Point = dc_Map.World2DC(m_pTIN->Get_Point(i)->Get_Point());
dc_Map.dc.DrawCircle(Point.x, Point.y, 5);
}
}
//---------------------------------------------------------
void CWKSP_TIN::_Draw_Edges(CWKSP_Map_DC &dc_Map)
{
int i;
CSG_TIN_Edge *pEdge;
TSG_Point_Int Point[2];
for(i=0; i<m_pTIN->Get_Edge_Count(); i++)
{
pEdge = m_pTIN->Get_Edge(i);
Point[0] = dc_Map.World2DC(pEdge->Get_Point(0)->Get_Point());
Point[1] = dc_Map.World2DC(pEdge->Get_Point(1)->Get_Point());
dc_Map.dc.DrawLine(Point[0].x, Point[0].y, Point[1].x, Point[1].y);
}
}
//---------------------------------------------------------
void CWKSP_TIN::_Draw_Triangles(CWKSP_Map_DC &dc_Map)
{
if( m_Parameters("DISPLAY_TRIANGES")->asBool()
&& dc_Map.IMG_Draw_Begin(m_Parameters("DISPLAY_TRANSPARENCY")->asDouble() / 100.0) )
{
int iTriangle, iPoint;
TSG_Point_Int Point;
TPoint p[3];
CSG_TIN_Triangle *pTriangle;
for(iTriangle=0; iTriangle<m_pTIN->Get_Triangle_Count(); iTriangle++)
{
pTriangle = m_pTIN->Get_Triangle(iTriangle);
if( dc_Map.m_rWorld.Intersects(pTriangle->Get_Extent()) != INTERSECTION_None )
{
for(iPoint=0; iPoint<3; iPoint++)
{
Point = dc_Map.World2DC(pTriangle->Get_Point(iPoint)->Get_Point());
p[iPoint].x = Point.x;
p[iPoint].y = Point.y;
p[iPoint].z = pTriangle->Get_Point(iPoint)->Get_Record()->asDouble(m_Color_Field);
}
_Draw_Triangle(dc_Map, p);
}
}
dc_Map.IMG_Draw_End();
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#define SORT_POINTS_Y(a, b) if( p[a].y < p[b].y ) { pp = p[a]; p[a] = p[b]; p[b] = pp; }
#define SORT_POINTS_X(a, b) if( p[a].x < p[b].x ) { pp = p[a]; p[a] = p[b]; p[b] = pp; }
#define DRAW_PIXEL(x, y, z) if( m_pClassify->Get_Class_Color_byValue(z, Color) ) { dc_Map.IMG_Set_Pixel(x, y, Color); }
//---------------------------------------------------------
void CWKSP_TIN::_Draw_Triangle(CWKSP_Map_DC &dc_Map, TPoint p[3])
{
int i, j, y, y_j, Color;
double x, x_a, dx, dx_a, dy, z, z_a, dz, dz_a;
TPoint pp;
//-----------------------------------------------------
SORT_POINTS_Y(1, 0);
SORT_POINTS_Y(2, 0);
SORT_POINTS_Y(2, 1);
//-----------------------------------------------------
if( p[2].y == p[0].y )
{
if( p[0].y >= 0 && p[0].y < dc_Map.m_rDC.GetHeight() )
{
SORT_POINTS_X(1, 0);
SORT_POINTS_X(2, 0);
SORT_POINTS_X(2, 1);
//---------------------------------------------
if( p[2].x == p[0].x )
{
if( p[0].x >= 0 && p[0].x < dc_Map.m_rDC.GetWidth() )
{
DRAW_PIXEL(p[0].x, p[0].y, p[0].z > p[1].z
? (p[0].z > p[2].z ? p[0].z : p[2].z)
: (p[1].z > p[2].z ? p[1].z : p[2].z)
);
}
}
//---------------------------------------------
else
{
_Draw_Triangle_Line(dc_Map, p[0].x, p[1].x, p[0].y, p[0].z, p[1].z);
_Draw_Triangle_Line(dc_Map, p[1].x, p[2].x, p[0].y, p[1].z, p[2].z);
}
}
}
//-----------------------------------------------------
else if( !((p[0].y < 0 && p[2].y < 0) || (p[0].y >= dc_Map.m_rDC.GetHeight() && p[2].y >= dc_Map.m_rDC.GetHeight())) )
{
dy = p[2].y - p[0].y;
dx_a = (p[2].x - p[0].x) / dy;
dz_a = (p[2].z - p[0].z) / dy;
x_a = p[0].x;
z_a = p[0].z;
for(i=0, j=1; i<2; i++, j++)
{
if( (dy = p[j].y - p[i].y) > 0.0 )
{
dx = (p[j].x - p[i].x) / dy;
dz = (p[j].z - p[i].z) / dy;
x = p[i].x;
z = p[i].z;
if( (y = p[i].y) < 0 )
{
x -= y * dx;
z -= y * dz;
y = 0;
x_a = p[0].x - p[0].y * dx_a;
z_a = p[0].z - p[0].y * dz_a;
}
if( (y_j = p[j].y) > dc_Map.m_rDC.GetHeight() )
{
y_j = dc_Map.m_rDC.GetHeight();
}
for( ; y<y_j; y++, x+=dx, z+=dz, x_a+=dx_a, z_a+=dz_a)
{
if( x < x_a )
{
_Draw_Triangle_Line(dc_Map, (int)x, (int)x_a, y, z, z_a);
}
else
{
_Draw_Triangle_Line(dc_Map, (int)x_a, (int)x, y, z_a, z);
}
}
}
}
}
}
//---------------------------------------------------------
inline void CWKSP_TIN::_Draw_Triangle_Line(CWKSP_Map_DC &dc_Map, int xa, int xb, int y, double za, double zb)
{
int Color;
double dz;
if( (dz = xb - xa) > 0.0 )
{
dz = (zb - za) / dz;
if( xa < 0 )
{
za -= dz * xa;
xa = 0;
}
if( xb >= dc_Map.m_rDC.GetWidth() )
{
xb = dc_Map.m_rDC.GetWidth() - 1;
}
for(int x=xa; x<=xb; x++, za+=dz)
{
DRAW_PIXEL(x, y, za);
}
}
else if( xa >= 0 && xa < dc_Map.m_rDC.GetWidth() )
{
DRAW_PIXEL(xa, y, za);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -