📄 view_map_3d_image.cpp
字号:
else
{
r_m = m_img_ny / r_ext;
r_kx = (m_img_nx - r_m * r_ext) / 2.0;
r_ky = m_img_ny;
}
r_ext = -r_ext / 2.0;
//-----------------------------------------------------
for(y=0, iy=-yRange/2.0; y<m_nyPoints; y++, iy+=dy)
{
for(x=0, ix=-xRange/2.0, p=m_Points[y]; x<m_nxPoints; x++, ix+=dx, p++)
{
if( (p->Flags & FLAG_DATA) != 0 && _Rotate_Point(ix, iy, dz * p->zDEM, px, py, pz) )
{
p->x = (int)px;
p->y = (int)py;
p->z = pz;
p->Flags |= FLAG_PROJECTION;
}
else
{
p->Flags &= ~FLAG_PROJECTION;
}
}
}
}
//---------------------------------------------------------
inline bool CVIEW_Map_3D_Image::_Rotate_Point(double x, double y, double z, double &px, double &py, double &pz)
{
//-----------------------------------------------------
px = r_cos_z * x - r_sin_z * y;
py = r_sin_z * x + r_cos_z * y;
switch( m_Figure )
{
default:
break;
case 1: // cylinder around x-axis
x = r_fig*r_fig - py*py;
z += r_fig - (x > 0.0 ? sqrt(x) : 0.0);
break;
case 2: // ball
x = r_fig*r_fig - py*py - px*px;
z += r_fig - (x > 0.0 ? sqrt(x) : 0.0);
break;
case 3: // panaroma
x = m_Figure_Weight * 20.0 * (0.5 * RANGE - py) / RANGE;
z += x*x;
break;
}
pz = r_cos_x * z - r_sin_x * py;
py = r_sin_x * z + r_cos_x * py;
z = pz;
pz = r_cos_y * z - r_sin_y * px;
px = r_sin_y * z + r_cos_y * px;
px += m_xShift;
py += m_yShift;
pz += m_zShift;
//-----------------------------------------------------
if( m_bCentral )
{
if( pz > 0.0 )
{
pz = m_Central / pz;
px *= pz;
py *= pz;
}
else
{
return( false );
}
}
else
{
if( m_zShift > 0.0 )
{
z = m_Central / m_zShift;
px *= z;
py *= z;
pz = -pz;
}
else
{
return( false );
}
}
//-----------------------------------------------------
px = r_kx + r_m * (px - r_ext);
py = r_ky - r_m * (py - r_ext);
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CVIEW_Map_3D_Image::_Draw_Image(void)
{
int x, y;
TPoint p[3];
//-----------------------------------------------------
for(y=0; y<m_img_ny; y++)
{
for(x=0; x<m_img_nx; x++)
{
m_img_z[y][x] = m_Missing;
}
}
//-----------------------------------------------------
for(y=0; y<m_nyPoints-1; y++)
{
for(x=0; x<m_nxPoints-1; x++)
{
p[0] = m_Points[y ][x ];
p[1] = m_Points[y + 1][x + 1];
p[2] = m_Points[y ][x + 1];
if( m_bInterpol )
_Draw_Triangle_i(p);
else
_Draw_Triangle (p);
//---------------------------------------------
p[0] = m_Points[y ][x ];
p[1] = m_Points[y + 1][x + 1];
p[2] = m_Points[y + 1][x ];
if( m_bInterpol )
_Draw_Triangle_i(p);
else
_Draw_Triangle (p);
}
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#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, r, g, b) if( z > m_img_z[y][x] ) { m_img_z[y][x] = z; m_img.SetRGB(x, y, r, g, b); }
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CVIEW_Map_3D_Image::_Draw_Triangle(TPoint p[3])
{
BYTE r, g, b;
int i, j, k, y, y_j;
double dy, x[2], dx[2], z[2], dz[2];
TPoint pp;
//-----------------------------------------------------
if( (p[0].Flags & FLAG_COLOR) == 0
|| (p[0].Flags & FLAG_PROJECTION) == 0
|| (p[1].Flags & FLAG_PROJECTION) == 0
|| (p[2].Flags & FLAG_PROJECTION) == 0 )
{
return;
}
//-----------------------------------------------------
r = p[0].r;
g = p[0].g;
b = p[0].b;
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 < m_img_ny )
{
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 < m_img_nx )
{
i = p[0].z > p[1].z ? (p[0].z > p[2].z ? 0 : 2) : (p[1].z > p[2].z ? 1 : 2);
_Draw_Pixel(p[0].x, p[0].y, p[i].z, r, g, b);
}
}
//---------------------------------------------
else
{
_Draw_Line(p[0].x, p[1].x, p[0].y, p[0].z, p[1].z, r, g, b);
_Draw_Line(p[1].x, p[2].x, p[0].y, p[1].z, p[2].z, r, g, b);
}
}
}
//-----------------------------------------------------
else if( !((p[0].y < 0 && p[2].y < 0) || (p[0].y >= m_img_ny && p[2].y >= m_img_ny)) )
{
dy = p[2].y - p[0].y;
dx[0] = (p[2].x - p[0].x) / dy;
dz[0] = (p[2].z - p[0].z) / dy;
x [0] = p[0].x;
z [0] = p[0].z;
for(i=0, j=1; i<2; i++, j++)
{
if( (dy = p[j].y - p[i].y) > 0.0 )
{
dx[1] = (p[j].x - p[i].x) / dy;
dz[1] = (p[j].z - p[i].z) / dy;
x [1] = p[i].x;
z [1] = p[i].z;
if( (y = p[i].y) < 0 )
{
x[1] -= y * dx[1];
z[1] -= y * dz[1];
y = 0;
x[0] = p[0].x - p[0].y * dx[0];
z[0] = p[0].z - p[0].y * dz[0];
}
if( (y_j = p[j].y) > m_img_ny )
{
y_j = m_img_ny;
}
for( ; y<y_j; y++)
{
if( x[1] < x[0] )
{
_Draw_Line((int)x[1], (int)x[0], y, z[1], z[0], r, g, b);
}
else
{
_Draw_Line((int)x[0], (int)x[1], y, z[0], z[1], r, g, b);
}
for(k=0; k<=1; k++)
{
x[k] += dx[k];
z[k] += dz[k];
}
}
}
}
}
}
//---------------------------------------------------------
inline void CVIEW_Map_3D_Image::_Draw_Line(int xa, int xb, int y, double za, double zb, BYTE r, BYTE g, BYTE b)
{
double dz;
if( (dz = xb - xa) > 0.0 )
{
dz = (zb - za) / dz;
if( xa < 0 )
{
za -= dz * xa;
xa = 0;
}
if( xb >= m_img_nx )
{
xb = m_img_nx - 1;
}
for(int x=xa; x<=xb; x++, za+=dz)
{
_Draw_Pixel(x, y, za, r, g, b);
}
}
else if( xa >= 0 && xa < m_img_nx )
{
_Draw_Pixel(xa, y, za, r, g, b);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
void CVIEW_Map_3D_Image::_Draw_Triangle_i(TPoint p[3])
{
int i, j, k, y, y_j;
double x[2], dx[2], dy, z[2], dz[2], r[2], dr[2], g[2], dg[2], b[2], db[2];
TPoint pp;
//-----------------------------------------------------
i = FLAG_ALL;
if( (p[0].Flags != i) || (p[1].Flags != i) || (p[2].Flags != i) )
{
return;
}
//-----------------------------------------------------
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 < m_img_ny )
{
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 < m_img_nx )
{
i = p[0].z > p[1].z ? (p[0].z > p[2].z ? 0 : 2) : (p[1].z > p[2].z ? 1 : 2);
_Draw_Pixel(p[0].x, p[0].y, p[i].z, p[i].r, p[i].g, p[i].b);
}
}
//---------------------------------------------
else
{
_Draw_Line_i(p[0].x, p[1].x, p[0].y, p[0].z, p[1].z, p[0].r, p[1].r, p[0].g, p[1].g, p[0].b, p[1].b);
_Draw_Line_i(p[1].x, p[2].x, p[0].y, p[1].z, p[2].z, p[1].r, p[2].r, p[1].g, p[2].g, p[1].b, p[2].b);
}
}
}
//-----------------------------------------------------
else if( !((p[0].y < 0 && p[2].y < 0) || (p[0].y >= m_img_ny && p[2].y >= m_img_ny)) )
{
dy = p[2].y - p[0].y;
dx[0] = (p[2].x - p[0].x) / dy;
dz[0] = (p[2].z - p[0].z) / dy;
dr[0] = (p[2].r - p[0].r) / dy;
dg[0] = (p[2].g - p[0].g) / dy;
db[0] = (p[2].b - p[0].b) / dy;
x [0] = p[0].x;
z [0] = p[0].z;
r [0] = p[0].r;
g [0] = p[0].g;
b [0] = p[0].b;
for(i=0, j=1; i<2; i++, j++)
{
if( (dy = p[j].y - p[i].y) > 0.0 )
{
dx[1] = (p[j].x - p[i].x) / dy;
dz[1] = (p[j].z - p[i].z) / dy;
dr[1] = (p[j].r - p[i].r) / dy;
dg[1] = (p[j].g - p[i].g) / dy;
db[1] = (p[j].b - p[i].b) / dy;
x [1] = p[i].x;
z [1] = p[i].z;
r [1] = p[i].r;
g [1] = p[i].g;
b [1] = p[i].b;
if( (y = p[i].y) < 0 )
{
x[1] -= y * dx[1];
z[1] -= y * dz[1];
r[1] -= y * dr[1];
g[1] -= y * dg[1];
b[1] -= y * db[1];
y = 0;
x[0] = p[0].x - p[0].y * dx[0];
z[0] = p[0].z - p[0].y * dz[0];
r[0] = p[0].r - p[0].y * dr[0];
g[0] = p[0].g - p[0].y * dg[0];
b[0] = p[0].b - p[0].y * db[0];
}
if( (y_j = p[j].y) > m_img_ny )
{
y_j = m_img_ny;
}
for( ; y<y_j; y++)
{
if( x[1] < x[0] )
{
_Draw_Line_i((int)x[1], (int)x[0], y, z[1], z[0], r[1], r[0], g[1], g[0], b[1], b[0]);
}
else
{
_Draw_Line_i((int)x[0], (int)x[1], y, z[0], z[1], r[0], r[1], g[0], g[1], b[0], b[1]);
}
for(k=0; k<=1; k++)
{
x[k] += dx[k];
z[k] += dz[k];
r[k] += dr[k];
g[k] += dg[k];
b[k] += db[k];
}
}
}
}
}
}
//---------------------------------------------------------
inline void CVIEW_Map_3D_Image::_Draw_Line_i(int xa, int xb, int y, double za, double zb, double ra, double rb, double ga, double gb, double ba, double bb)
{
double d, dz, dr, dg, db;
if( (d = xb - xa) > 0.0 )
{
dz = (zb - za) / d;
dr = (rb - ra) / d;
dg = (gb - ga) / d;
db = (bb - ba) / d;
if( xa < 0 )
{
za -= dz * xa;
ra -= dr * xa;
ga -= dg * xa;
ba -= db * xa;
xa = 0;
}
if( xb >= m_img_nx )
{
xb = m_img_nx - 1;
}
for(int x=xa; x<=xb; x++, za+=dz, ra+=dr, ga+=dg, ba+=db)
{
_Draw_Pixel(x, y, za, (int)ra, (int)ga, (int)ba);
}
}
else if( xa >= 0 && xa < m_img_nx )
{
_Draw_Pixel(xa, y, za, (int)ra, (int)ga, (int)ba);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -