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

📄 bounding_linear_box.m

📁 一个matlab的将军模型
💻 M
📖 第 1 页 / 共 2 页
字号:
      	elseif (elem>=lim_med_parallel)
         	test_value 	= 1;
         	test_angle 	= 1;
         	for k=1:length(nvec{nvec{i}(index)})
            	vec2 = CIproj(nvec{nvec{i}(index)}(k),:);
            	vec3 = CIproj(nvec{i}(index),:);
         		if ~compvec(vec2,zeros(1,length(vec2)))
               	if (elem  < (vec2*vec3')/sqrt((vec2*vec2')*(vec3*vec3')) - GLOBAL_APPROX_PARAM.poly_epsilon)
                  	test_value 	= 0;
               	end
               	factor= (vec2*vec0')/sqrt((vec2*vec2')*(vec0*vec0'));
               	if (lim_max_parallel - factor) > GLOBAL_APPROX_PARAM.poly_epsilon
                  	test_angle 	= 0;
               	end
            	end
         	end
         	test_length = (dist(i)> edge_factor*dist(nvec{i}(index)));      
            if (test_value & test_angle & test_length) 
               j 				= index;
            	j1 			= nvec{i}(j);
               dist(j1) 	= 0;
               [new_CI,new_d,new_proj]	= ...
                  create_new_hyper(vector_elem{i}{j},CIm(i,:),CIm(j1,:),dist(i),dist(j1),CEm);
               CIm(i,:)		= new_CI;
               dIm(i) 		= new_d;
               CIproj(i,:) = new_proj;
            	CIproj(j1,:)= zeros(1,size(CIproj,2));
            	CIm(j1,:)	= zeros(1,size(CIm,2));
               dIm(j1,:) 	= 0;
           		for m=1:length(nvec)
               	for k=1:length(nvec{m})
                  	if nvec{m}(k) == j1
                     	nvec{m}(k) = i;
                  	end
               	end
            	end
            	nvec{i} = [nvec{i} nvec{j1}];
            	vector = [];
            	for n=1:length(nvec{i})
               	if nvec{i}(n) ~= i;
                  	vector = [vector nvec{i}(n)];
               	end
               end
              	nvec{i} = unique(vector);
               nvec{j1} = [];
               [vector_elem{i},dist(i)]= compute_new_vertices(nvec{i},i,CIm,dIm,CEm,dEm);
            	%save teste1 vector_elem
               vector_elem{j1} = {};
               med = adjust_med(dist);
	         end
      	elseif (elem>=lim_extra_parallel)
         	test_value 	= 1;
         	test_angle 	= 1;
         	for k=1:length(nvec{nvec{i}(index)})
            	vec2 = CIproj(nvec{nvec{i}(index)}(k),:);
            	vec3 = CIproj(nvec{i}(index),:);
         		if ~compvec(vec2,zeros(1,length(vec2)))
               	if (elem  < (vec2*vec3')/sqrt((vec2*vec2')*(vec3*vec3')) - GLOBAL_APPROX_PARAM.poly_epsilon)
                  	test_value 	= 0;
               	end
               	factor= (vec2*vec0')/sqrt((vec2*vec2')*(vec0*vec0'));
               	if (lim_unbound - factor) > GLOBAL_APPROX_PARAM.poly_epsilon
                  	test_angle 	= 0;
               	end
            	end
         	end
         	test_length = (dist(i)> edge_factor*dist(nvec{i}(index)));      
            teste_med_length_j1 	= (dist(nvec{i}(index))<= med_length*med);
            if (test_value & test_angle & teste_med_length_j1 & test_length)
            	j 				= index;
            	j1 			= nvec{i}(j);
               dist(j1) 	= 0;
               [new_CI,new_d,new_proj]	= ...
                  create_new_hyper(vector_elem{i}{j},CIm(i,:),CIm(j1,:),dist(i),dist(j1),CEm);
               CIm(i,:)		= new_CI;
               dIm(i) 		= new_d;
               CIproj(i,:) = new_proj;
            	CIproj(j1,:)= zeros(1,size(CIproj,2));
            	CIm(j1,:)	= zeros(1,size(CIm,2));
               dIm(j1,:) 	= 0;
           		for m=1:length(nvec)
               	for k=1:length(nvec{m})
                  	if nvec{m}(k) == j1
                     	nvec{m}(k) = i;
                  	end
               	end
            	end
            	nvec{i} = [nvec{i} nvec{j1}];
            	vector = [];
            	for n=1:length(nvec{i})
               	if nvec{i}(n) ~= i;
                  	vector = [vector nvec{i}(n)];
               	end
            	end
              	nvec{i} = unique(vector);
               nvec{j1} = [];
               [vector_elem{i},dist(i)]= compute_new_vertices(nvec{i},i,CIm,dIm,CEm,dEm);
            	vector_elem{j1} = {};
               med = adjust_med(dist);
	         end
			end
	   end   
   end
	i = mod(i, length(nvec)+1) + 1;
   if (i==length(nvec)+1) 
      if (CIproj == CIold)
         END_OK = 1;
      end
      i=1;
   end
end         

% Throw away the lines of CIm that are zeroed.
CInew=[];
dInew=[];
for i = 1:length(CIproj)
   if  ~compvec(CIproj(i,:),zeros(1,size(CIproj,2)))
      CInew(size(CInew,1)+1,:)= CIm(i,:);
      dInew(length(dInew)+1)= dIm(i);
   end
end

% Make sure the new mapping is contained in the invariant face.
Cface 		= get_linearcon_param(face_poly,'CE');
dface 		= get_linearcon_param(face_poly,'dE');
new_mapping = linearcon(Cface,dface,CInew,dInew');

box = and(new_mapping,face_poly);
%fprintf(1,'printing box...\n')
%plot(box);
%fprintf(1,' done. Press any key\n')
%pause;

return

% -----------------------------------------------------------------------------

function retcode = compvec(v1,v2)

   if (length(v1) == length(v2))
      if (v1 == v2)
         retcode = 1;
      else
         retcode =0;
      end
   else
 	   retcode =0;
    end
    
return

% -----------------------------------------------------------------------------

function  [new_CI,new_d,new_proj] = create_new_hyper(vector_elem,CI_A,CI_B,distA,distB,CE)

global GLOBAL_APPROX_PARAM

new_CI 	= (CI_A*distA + CI_B*distB)/(distA+distB);
if ~compvec(new_CI,zeros(1,length(new_CI)))
	new_CI   = new_CI/sqrt(new_CI*new_CI');
else
   new_CI = CI_A;
end  
for i=1:size(vector_elem,2)
   d(i)  	= new_CI*vector_elem(:,i);
end
new_d = max(d);

vec=[];
base=[];
new_proj = new_CI;
for i=1:size(CE,1)
  vec = CE(i,:); 
  if ~ compvec(vec,zeros(1,length(vec)))
  		base(i,:) = vec/sqrt(vec*vec');
   	new_proj = new_proj - (new_proj*base(i,:)')*base(i,:);
   	if abs(new_proj*base(i,:)')>GLOBAL_APPROX_PARAM.poly_epsilon
      	fprintf(1,'\n warning! normal vector could not be found.\n')
   	end
	end
end

return

% -----------------------------------------------------------------------------

function  [new_vertices,dist] = compute_new_vertices(neighbors,index,CI,dI,CE,dE)

new_vertices = {};
CEp =[CE;CI(index,:)];
dEp = [dE;dI(index)];
CIp = [];
dIp = [];
for o=1:length(neighbors)
	CIp = [CIp ; CI(neighbors(o),:)];
   dIp = [dIp ; dI(neighbors(o))];
end
new_poly 	= 	linearcon(CEp,dEp,CIp,dIp);
new_polytope = clean_up(new_poly);
new_polyhedron =	polyhedron(new_polytope);
av   =  vertices(new_polytope); 
Vm		= get_param(new_polyhedron,'VI');

for j=1:length(Vm)
   for k=1:length(Vm{j})
      aux = Vm{j}(k);
      if length(new_vertices)<j
         new_vertices{j} = aux;
      else
         new_vertices{j} = [new_vertices{j} aux];
      end
   end
end
dist = 0;
for j=1:length(av)
   for k=j+1:length(av)
      aux_dist = sqrt((av(j) - av(k))'*(av(j) - av(k)));
      if (dist <= aux_dist)
         dist =aux_dist;
      end
   end	   
end


return

% -----------------------------------------------------------------------------

function  med = adjust_med(dist)

x=[];
for i=1:length(dist)
   if (dist(i)~=0)
      x(length(x)+1)=dist(i);
   end
end
med = mean(x);

return

⌨️ 快捷键说明

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