⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 view_map_3d_image.cpp

📁 这是一个GPS相关的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -