www.pudn.com > snake_c++.rar > snake.cpp


	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]