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

📄 draw_funcs.h

📁 A Library of Efficient Data Types and Algorithms,封装了常用的ADT及其相关算法的软件包
💻 H
📖 第 1 页 / 共 2 页
字号:
// some drawing functions 

// 0 = zpos   ; 1 = zmin ; 2 = zmax ; 3 = z_grid_dist ;
// 4 = height ; 5 = xmin ; 6 = xmax

// 0 = ypos   ; 1 = ymin ; 2 = ymax ; 3 = y_grid_dist ;
// 4 = depth ; 5 = xmin ; 6 = xmax

void draw_x_parallels(double params[7], const int& index1, const int& index2)					  
{
	double* p1;
	double* p2;

	if(index1 > index2){
		p1 = params+4;
		p2 = params+2;		
	}
	else{
		p1 = params+2;
		p2 = params+4;		
	}	
         
	while(params[0] < params[2]){
		glVertex3d(params[5],params[index1],params[index2]);
		glVertex3d(params[6],params[index1],params[index2]);			
		params[0] += params[3];
	}
	
	glVertex3d(params[5],*p1,*p2);
	glVertex3d(params[6],*p1,*p2);

	params[0] = 0.0;

	while(params[0] > params[1]){
		glVertex3d(params[5],params[index1],params[index2]);
		glVertex3d(params[6],params[index1],params[index2]);			
		params[0] -= params[3];
	}

	if(index1 > index2)
		--p2;
	else
		--p1;
	
	glVertex3d(params[5],*p1,*p2);
	glVertex3d(params[6],*p1,*p2);	
}


// 0 = xpos   ; 1 = xmin ; 2 = xmax ; 3 = x_grid_dist ;
// 4 = depth  ; 5 = ymin ; 6 = ymax

// 0 = zpos   ; 1 = zmin ; 2 = zmax ; 3 = z_grid_dist ;
// 4 = width  ; 5 = ymin ; 6 = ymax 

void draw_y_parallels(double params[7], const int& index1, const int& index2)
{
	double* p1;
	double* p2;

	if(index1 > index2){
		p1 = params+4;
		p2 = params+2;
	}
	else{
		p1 = params+2;
		p2 = params+4;
	}	
         
	while(params[0] < params[2]){
		glVertex3d(params[index2],params[5],params[index1]);
		glVertex3d(params[index2],params[6],params[index1]);			
		params[0] += params[3];
	}
	glVertex3d(*p2,params[5],*p1);
	glVertex3d(*p2,params[6],*p1);

	params[0] = 0.0;

	while(params[0] > params[1]){
		glVertex3d(params[index2],params[5],params[index1]);
		glVertex3d(params[index2],params[6],params[index1]);			
		params[0] -= params[3];
	}

	if(index1 > index2)
		--p2;
	else
		--p1;

	glVertex3d(*p2,params[5],*p1);
	glVertex3d(*p2,params[6],*p1);	
}


// 0 = xpos   ; 1 = xmin ; 2 = xmax ; 3 = x_grid_dist ;
// 4 = height ; 5 = zmin ; 6 = zmax

// 0 = ypos   ; 1 = ymin ; 2 = ymax ; 3 = y_grid_dist ;
// 4 = width  ; 5 = zmin ; 6 = zmax

void draw_z_parallels(double params[7], const int& index1, const int& index2)
{
	double* p1;
	double* p2;

	if(index1 > index2){
		p1 = params+4;
		p2 = params+2;
	}
	else{
		p1 = params+2;
		p2 = params+4;
	}	
         
	while(params[0] < params[2]){
		glVertex3d(params[index2],params[index1],params[5]);
		glVertex3d(params[index2],params[index1],params[6]);			
		params[0] += params[3];
	}
	glVertex3d(*p2,*p1,params[5]);
	glVertex3d(*p2,*p1,params[6]);

	params[0] = 0.0;

	while(params[0] > params[1]){
		glVertex3d(params[index2],params[index1],params[5]);
		glVertex3d(params[index2],params[index1],params[6]);			
		params[0] -= params[3];
	}

	if(index1 > index2)
		--p2;
	else
		--p1;

	glVertex3d(*p2,*p1,params[5]);
	glVertex3d(*p2,*p1,params[6]);	
}


void draw_front_back(const unsigned int& tex_num, const bool& front)
{		 
		 float y_step = tex_height[tex_num];
		 float x_step = tex_width[tex_num];
		 
		 if(y_step > (box_ymax - box_ymin)) y_step = box_ymax - box_ymin;
		 if(x_step > (box_xmax - box_xmin)) x_step = box_xmax - box_xmin;

		 float xpos  = box_xmin;
		 float xpos2 = box_xmin + x_step;
		 float ypos  = box_ymin;
		 float ypos2 = box_ymin + y_step;
		 bool  flag  = true;		 

		 float map_x1 = 0.0f;
		 float map_x2 = 1.0f;
		 float z = box_zmin;
		 if(front){
			 map_x1 = 1.0f;
			 map_x2 = 0.0f;
			 z = box_zmax;
		 }		 		 

		 if(T[tex_num] != NULL){				
			 glBindTexture(GL_TEXTURE_2D, tex_name[tex_num]);
			 glBegin(GL_QUADS);	
		 }
		 else return;		 		 		 

		 while(ypos<box_ymax)
		 {
			 if(flag)
			 {
				 while(xpos2 < box_xmax)
				 {						 
					 glTexCoord2f(map_x1, 0.0f); glVertex3f(xpos  ,ypos , z);
				     glTexCoord2f(map_x1, 1.0f); glVertex3f(xpos  ,ypos2, z);					 						 
					 glTexCoord2f(map_x2, 1.0f); glVertex3f(xpos2 ,ypos2, z);
				 	 glTexCoord2f(map_x2, 0.0f); glVertex3f(xpos2 ,ypos , z);					 
					 					 
					 xpos  += x_step;
					 xpos2 += x_step;
				 }				 

				 xpos2 = box_xmax;				 
				 
				 glTexCoord2f(map_x1, 0.0f); glVertex3f(xpos  ,ypos , z );
				 glTexCoord2f(map_x1, 1.0f); glVertex3f(xpos  ,ypos2, z );				 
                 glTexCoord2f(map_x2, 1.0f); glVertex3f(xpos2 ,ypos2, z );
				 glTexCoord2f(map_x2, 0.0f); glVertex3f(xpos2 ,ypos , z );				 				 				 

				 ypos  += y_step;
				 ypos2 += y_step;
				 flag = false;
			 }
			 else
			 {					 
				 glTexCoord2f(map_x2, 0.0f); glVertex3f(xpos2 ,ypos,  z ); 
				 glTexCoord2f(map_x2, 1.0f); glVertex3f(xpos2 ,ypos2, z );				 					 
				 glTexCoord2f(map_x1, 1.0f); glVertex3f(xpos  ,ypos2, z );
				 glTexCoord2f(map_x1, 0.0f); glVertex3f(xpos  ,ypos,  z );				
				 				 
				 xpos2 = xpos + x_step;

				 do{
					 xpos  -= x_step;
					 xpos2 -= x_step;
					 
					 glTexCoord2f(map_x2, 0.0f); glVertex3f(xpos2 ,ypos,  z ); 
					 glTexCoord2f(map_x2, 1.0f); glVertex3f(xpos2 ,ypos2, z );					 
					 glTexCoord2f(map_x1, 1.0f); glVertex3f(xpos  ,ypos2, z );
					 glTexCoord2f(map_x1, 0.0f); glVertex3f(xpos  ,ypos,  z );											 
					 					 
				 }while(xpos > box_xmin);							 

				 ypos  += y_step;
				 ypos2 += y_step;
				 flag = true;
			 }
			 
			 if(ypos2 > box_ymax)
				 ypos2 = box_ymax;
		 }	
		 
		 glEnd();		 			 			
}


void draw_left_right(const unsigned int& tex_num, const bool& left)
{			 
		 float y_step = tex_height[tex_num];
		 float z_step = tex_width[tex_num];
		 
		 if(y_step > (box_ymax - box_ymin)) y_step = box_ymax - box_ymin;
		 if(z_step > (box_zmax - box_zmin)) z_step = box_zmax - box_zmin;

		 float zpos  = box_zmin;
		 float zpos2 = box_zmin + z_step;
		 float ypos  = box_ymin;
		 float ypos2 = box_ymin + y_step;
		 bool  flag  = true;
		 
		 float map_x1 = 0.0f;
		 float map_x2 = 1.0f;
		 float x = box_xmax;

		 if(left){
			 map_x1 = 1.0f;
			 map_x2 = 0.0f;
			 x = box_xmin;
		 }		 		 

		 if(T[tex_num] != NULL){			 
			glBindTexture(GL_TEXTURE_2D, tex_name[tex_num]);
			glBegin(GL_QUADS);	
		 }
		 else return;		

		 while(zpos<box_zmax)
		 {
			 if(flag)
			 {
				 while(ypos2 < box_ymax)
				 {						 
					 glTexCoord2f(map_x1, 0.0f); glVertex3f(x ,ypos,  zpos );
				     glTexCoord2f(map_x1, 1.0f); glVertex3f(x ,ypos2, zpos );					 
                     glTexCoord2f(map_x2, 1.0f); glVertex3f(x ,ypos2, zpos2);
					 glTexCoord2f(map_x2, 0.0f); glVertex3f(x ,ypos , zpos2);											 
					 					 
					 ypos  += y_step;
					 ypos2 += y_step;
				 }				 

				 ypos2 = box_ymax;				 
				 glTexCoord2f(map_x1, 0.0f); glVertex3f(x ,ypos , zpos );
				 glTexCoord2f(map_x1, 1.0f); glVertex3f(x ,ypos2, zpos );				 
				 glTexCoord2f(map_x2, 1.0f); glVertex3f(x ,ypos2, zpos2);
				 glTexCoord2f(map_x2, 0.0f); glVertex3f(x ,ypos , zpos2);									 				 				 

				 zpos  += z_step;
				 zpos2 += z_step;
				 flag = false;
			 }
			 else
			 {					 
				 glTexCoord2f(map_x2, 0.0f); glVertex3f(x ,ypos , zpos2); 
				 glTexCoord2f(map_x2, 1.0f); glVertex3f(x ,ypos2, zpos2);				 				 
                 glTexCoord2f(map_x1, 1.0f); glVertex3f(x ,ypos2, zpos );
				 glTexCoord2f(map_x1, 0.0f); glVertex3f(x ,ypos , zpos );									 
				 				 
				 ypos2 = ypos + y_step;

				 do{
					 ypos  -= y_step;
					 ypos2 -= y_step;					 
					 glTexCoord2f(map_x2, 0.0f); glVertex3f(x ,ypos , zpos2); 
					 glTexCoord2f(map_x2, 1.0f); glVertex3f(x ,ypos2, zpos2);					 
					 glTexCoord2f(map_x1, 1.0f); glVertex3f(x ,ypos2, zpos );
					 glTexCoord2f(map_x1, 0.0f); glVertex3f(x ,ypos , zpos );											 
										 
				 }while(ypos > box_ymin);							 

				 zpos  += z_step;
				 zpos2 += z_step;
				 flag = true;
			 }
			 
			 if(zpos2 > box_zmax)
				 zpos2 = box_zmax;
		 }	
		 
		 glEnd();		 	 			
}


void draw_bottom_top(const unsigned int& tex_num, const bool& top)
{			 
		 float x_step = tex_width[tex_num];
		 float z_step = tex_height[tex_num];
		 
		 if(x_step > (box_xmax - box_xmin)) x_step = box_xmax - box_xmin;
		 if(z_step > (box_zmax - box_zmin)) z_step = box_zmax - box_zmin;

		 float zpos  = box_zmin;
		 float zpos2 = box_zmin + z_step;
		 float xpos  = box_xmin;
		 float xpos2 = box_xmin + x_step;
		 bool  flag  = true;
		 
		 float map_y1 = 0.0f;
		 float map_y2 = 1.0f;
		 float y = box_ymin;
		 if(top){
			 map_y1 = 1.0f;
			 map_y2 = 0.0f;
			 y = box_ymax;
		 }		 		 

		 if(T[tex_num] != NULL){			  
			glBindTexture(GL_TEXTURE_2D, tex_name[tex_num]);
			glBegin(GL_QUADS);	
		 }
		 else return;		 

		 while(zpos<box_zmax)
		 {
			 if(flag)
			 {
				 while(xpos2 < box_xmax)
				 {					 
					 glTexCoord2f(1.0f, map_y1); glVertex3f(xpos  ,y, zpos );
				     glTexCoord2f(1.0f, map_y2); glVertex3f(xpos  ,y, zpos2);					 
					 glTexCoord2f(0.0f, map_y2); glVertex3f(xpos2 ,y, zpos2);
					 glTexCoord2f(0.0f, map_y1); glVertex3f(xpos2 ,y, zpos );											 
					 					 
					 xpos  += x_step;
					 xpos2 += x_step;
				 }				 

				 xpos2 = box_xmax;					 
				 glTexCoord2f(1.0f, map_y1); glVertex3f(xpos  ,y, zpos );
				 glTexCoord2f(1.0f, map_y2); glVertex3f(xpos  ,y, zpos2);				 
                 glTexCoord2f(0.0f, map_y2); glVertex3f(xpos2 ,y, zpos2);
				 glTexCoord2f(0.0f, map_y1); glVertex3f(xpos2 ,y, zpos );					 

				 zpos  += z_step;
				 zpos2 += z_step;
				 flag = false;
			 }
			 else
			 {					 
				 glTexCoord2f(0.0f, map_y1); glVertex3f(xpos2 ,y, zpos ); 
				 glTexCoord2f(0.0f, map_y2); glVertex3f(xpos2 ,y, zpos2);				 					
				 glTexCoord2f(1.0f, map_y2); glVertex3f(xpos  ,y, zpos2);
				 glTexCoord2f(1.0f, map_y1); glVertex3f(xpos  ,y, zpos );				 
				 				 
				 xpos2 = xpos + x_step;

				 do{
					 xpos  -= x_step;
					 xpos2 -= x_step;
					 
					 glTexCoord2f(0.0f, map_y1); glVertex3f(xpos2 ,y, zpos ); 
					 glTexCoord2f(0.0f, map_y2); glVertex3f(xpos2 ,y, zpos2); 					 						
					 glTexCoord2f(1.0f, map_y2); glVertex3f(xpos  ,y, zpos2);
					 glTexCoord2f(1.0f, map_y1); glVertex3f(xpos  ,y, zpos );					 
					 					 
				 }while(xpos > box_xmin);							 

				 zpos  += z_step;
				 zpos2 += z_step;
				 flag = true;
			 }
			 
			 if(zpos2 > box_zmax)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -