void Optimizer::FitSegments(mat& alpha,
	mat& beta, 
	mat& rho, 
	mat& lamda, 
	InputPtr input, 
	ModelPtr model,
	MeshPtr mesh, 
	ShapePtr shape,
	TexturePtr texture)
{

	mat eye_alpha = alpha;
	mat eye_beta = beta;
	mat nose_alpha = alpha;
	mat nose_beta = beta;
	mat mouth_alpha = alpha;
	mat mouth_beta = beta;
	mat rest_alpha = alpha;
	mat rest_beta = beta;


	Face3dModel face3d_model(shape, texture);
	mesh = face3d_model.Construction(alpha, beta);
	TwoPassZbuffer(rho, lamda, mesh, model, true); // cal segment two pass z-buffer


	for (int c = 0; c < 3; ++c)
	{	
		model->EnableIterator(ModelImage::NOSE);
		FitNose(nose_alpha, nose_beta, rho, lamda, input, model, mesh, shape, texture);

		model->EnableIterator(ModelImage::EYE);
		FitEye(eye_alpha, eye_beta, rho, lamda, input, model, mesh, shape, texture);

		model->EnableIterator(ModelImage::MOUTH);
		FitMouth(mouth_alpha, mouth_beta, rho, lamda, input, model, mesh, shape, texture);

		model->EnableIterator(ModelImage::REST);
		FitRest(rest_alpha, rest_beta, rho, lamda, input, model, mesh, shape, texture);

	}


	mat all_alpha(PrincipalNum,SegmentsNum);
	all_alpha.cols(0, 0) = nose_alpha;
	all_alpha.cols(1, 1) = eye_alpha;
	all_alpha.cols(2, 2) = mouth_alpha;
	all_alpha.cols(3, 3) = rest_alpha;

	mat all_beta(PrincipalNum, SegmentsNum);
	all_beta.cols(0, 0) = nose_beta;
	all_beta.cols(1, 1) = eye_beta;
	all_beta.cols(2, 2) = mouth_beta;
	all_beta.cols(3, 3) = rest_beta;


	mesh = face3d_model.Construction(all_alpha, all_beta);

	mesh->Blend();
	rho.quiet_save("rho_para", arma_binary);
	lamda.quiet_save("lamda_para", arma_binary);

}