www.pudn.com > snake.rar > snake.c


bool termination_point 
	bool neighbor3by3; /* true means 3x3 neighborhood, false means 5x5 neighborhood */ 
	int grad_mag[500][500];	/* Magnitude of Gradient */ 
	int m_Cols; /* Number of Columns */ 
	int m_Rows; /* Number of Rows */ 
	int no_of_snake_points; 
	CPoint Snake_points[200]; /* Snake Points */ 
	double *alpha,*beta, *gamma; /* Weights for energies */ 
	double threshold_curvature;  
	int threshold_movement; 
 
void Snake_algorithm()  
{ 
	bool flag_change; 
	int movement,i,j,iteration=0; 
	double avg_distance=0.0, max_curvature; 
	CPoint temp; 
	double *curvature;	 
	alpha=new double[no_of_snake_points]; 
	beta=new double[no_of_snake_points]; 
	gamma=new double[no_of_snake_points]; 
	curvature=new double[no_of_snake_points]; 
	termination_point=false; 
	 
	for(i=0;ithreshold_curvature&&curvature[i]>curvature[(i+1)%no_of_snake_points]&&curvature[i]>curvature[(i-1+no_of_snake_points)%no_of_snake_points]) 
				*(beta+i)=0; 
		} 
		if(movementMax_Iterations) 
			termination_point=true; 
	} 
	delete alpha; 
	delete beta; 
	delete gamma; 
	delete curvature; 
} 
 
 
double find_distance(int no, CPoint point) 
{ 
	int x=no_of_snake_points; 
	point-=Snake_points[(no-1+x)%x]; 
	return(sqrt(point.x*point.x+point.y*point.y)); 
} 
 
double find_curvature(int no, CPoint point) 
{ 
	int x=no_of_snake_points; 
	point=Snake_points[(no-1+x)%x]-point-point+Snake_points[(no+1)%x]; 
	return(point.x*point.x+point.y*point.y); 
} 
 
double find_continuity(int no, CPoint point, double avg_distance) 
{ 
	return(pow(avg_distance-find_distance(no,point),2)); 
} 
 
 
CPoint find_min_energy(int no, CPoint point, double avg_distance) 
{ 
	CPoint p, min_point; 
	double max_curvature, max_continuity, max_internal, min_internal, min_energy, energy; 
	double curvatures[5][5]; 
	double continuities[5][5]; 
	double internal_energies[5][5]; 
	int i,j, limit=1; 
	max_curvature=max_continuity=max_internal=-1000000000000.0; 
	min_internal=1000000000000.0; 
	if(!neighbor3by3) 
		limit++; 
	for(i=-limit;i<=limit;i++) 
	{ 
		p.y=point.y+i; 
		if(p.y<0) 
			p.y=0; 
		if(p.y>=m_Rows) 
			p.y=m_Rows-1; 
		for(j=-limit;j<=limit;j++) 
		{ 
			p.x=point.x+j; 
			if(p.x<0) 
				p.x=0; 
			if(p.x>=m_Cols) 
				p.x=m_Cols-1; 
			curvatures[i+limit][j+limit]=find_curvature(no, p); //This code can cause problem near 
			continuities[i+limit][j+limit]=find_continuity(no,p,avg_distance);	//border of image 
			internal_energies[i+limit][j+limit]=(double)grad_mag[p.y][p.x]; 
			if(curvatures[i+limit][j+limit]>max_curvature) 
				max_curvature=curvatures[i+limit][j+limit]; 
			if(continuities[i+limit][j+limit]>max_continuity) 
				max_continuity=continuities[i+limit][j+limit]; 
			if(internal_energies[i+limit][j+limit]>max_internal) 
				max_internal=internal_energies[i+limit][j+limit]; 
			if(internal_energies[i+limit][j+limit]