You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
5.4 KiB
240 lines
5.4 KiB
function mp=Build_RotateSampleTest()
|
|
% Bulid mp obj (contains models and all arguments)
|
|
%% init
|
|
pace=1;
|
|
Pst=[0 0 0]-[1 2 1]-pace*0.5001;
|
|
Ped=[10 20 10]+2;
|
|
Ped=FCM_dV.round_Ped(Pst,Ped,pace);
|
|
maxdeep=4;
|
|
order=1;
|
|
viewxy=[120 30];
|
|
|
|
|
|
Shape.accessThreshold(pace/maxdeep/2/2/2);%
|
|
Oa=[0 0 0];
|
|
Ra=[0 0 0];
|
|
|
|
rvec=(Ped-Pst)/pace
|
|
num_cells=rvec(1)*rvec(2)*rvec(3);
|
|
fprintf("num_cells: %.0f\n",num_cells);% show num of cells
|
|
|
|
|
|
%% add SS lib & python path
|
|
additon_path=pwd;
|
|
if count(py.sys.path,additon_path) == 0
|
|
insert(py.sys.path,int32(0),additon_path);
|
|
end
|
|
|
|
%% assemble c0
|
|
|
|
|
|
|
|
cyObjs=[];
|
|
|
|
pos=[
|
|
1 1 0;
|
|
0 1 0;
|
|
|
|
0 0 0;
|
|
1 0 0;
|
|
1 1 0;
|
|
|
|
0 0 1;
|
|
1 0 1;
|
|
1 1 1;
|
|
];
|
|
angle=[
|
|
0 0 0;
|
|
0 0 0;
|
|
|
|
-pi/2 0 0;
|
|
-pi/2 0 0;
|
|
0 -pi/2 0;
|
|
|
|
-pi/2 0 0;
|
|
-pi/2 0 0;
|
|
0 -pi/2 0;
|
|
];
|
|
|
|
for i=0:10:0
|
|
for j=0:10:10
|
|
for k=0:10:0
|
|
for idx=1:size(angle,1)
|
|
cy=CSG("Cylinder",[i j k]+pos(idx,:)*10,angle(idx,:),1,1*10);
|
|
cyObjs=[cyObjs cy];
|
|
end
|
|
end
|
|
end
|
|
end
|
|
firstFlg=1;
|
|
cys=[];
|
|
for cy=cyObjs
|
|
if firstFlg==1
|
|
firstFlg=0;
|
|
cys=cy;
|
|
else
|
|
cys=cys+cy;
|
|
end
|
|
end
|
|
%% tmp output
|
|
% c.set_display_args([Pst(1) Pst(2) Pst(3)],Ped,pace/5,'viewxy',viewxy);
|
|
% c.csg2stl('/home/cflin/Documents/MATLAB/MatlabCode/TopCSG/NNew_Data/RotateSample/CSG_plates');
|
|
%
|
|
% cys.set_display_args([Pst(1) Pst(2) Pst(3)],Ped,pace/5,'viewxy',viewxy);
|
|
% cys.csg2stl('/home/cflin/Documents/MATLAB/MatlabCode/TopCSG/NNew_Data/RotateSample/CSG_cylinders');
|
|
%
|
|
% limitedCube=CSG("Cube","corner",[0 0 0+0.1],Ra,[12 12 6]+[0 0 -0.1]);
|
|
% limitedCube.set_display_args([Pst(1) Pst(2) Pst(3)],Ped,pace/5,'viewxy',viewxy);
|
|
% limitedCube.csg2stl('/home/cflin/Documents/MATLAB/MatlabCode/TopCSG/NNew_Data/RotateSample/CSG_limitedCube');
|
|
%
|
|
% limitedCys=limitedCube*cys;
|
|
% limitedCys.set_display_args([Pst(1) Pst(2) Pst(3)],Ped,pace/5,'viewxy',viewxy);
|
|
% limitedCys.csg2stl('/home/cflin/Documents/MATLAB/MatlabCode/TopCSG/NNew_Data/RotateSample/CSG_limitedCylinders');
|
|
|
|
% left plate
|
|
leftPlate=CSG("Cube","corner",[0 0 0]-[1 2 1],Ra,[12 2 12]);
|
|
c=leftPlate+cys;
|
|
|
|
|
|
|
|
%---------------------------assemble c
|
|
|
|
% show model
|
|
clf;
|
|
c.set_display_args([Pst(1) Pst(2) Pst(3)],Ped,pace/5,'viewxy',viewxy);
|
|
c.display_csg();
|
|
% c.csg2stl('/home/cflin/Documents/MATLAB/MatlabCode/TopCSG/NNew_Data/RotateSample/initModel');
|
|
|
|
V0=1;
|
|
%%
|
|
% time and calculate Volume
|
|
tic
|
|
fcmv=FCM_V(Pst,Ped,pace,maxdeep,order,@c.calSF,@(X) ones(size(X,1),1));% |||1 dV
|
|
V0=fcmv.calIntegral_V();
|
|
fprintf('V0: %f ,Time: %f\n',V0,toc);
|
|
|
|
|
|
%% build Dirichlet/Neumann boundary
|
|
eepsD=1e-4;
|
|
eepsN=3;
|
|
|
|
Dirich_csg=CSG("Cube","corner",[0 0 0]-[1 2 1],Ra,[12 0 12]);
|
|
Dirich_csg.saveAs('Dir');
|
|
Dirich_csg.judge_func=@(X) abs(X(:,2)--2)< eepsD;
|
|
%------------------------------------------Neu
|
|
|
|
Neuman_csg=CSG("Cube","corner",[5 20 0]-[1 1 1],Ra,[2 2 2]);
|
|
Neuman_csg.judge_func=@(X) abs(X(:,2)-20)<eepsN & abs(X(:,1)-5)<0.2;
|
|
Neuman_csg.fdv=@cal_NeuF;
|
|
|
|
fcmdv=FCM_dV(Pst,Ped,pace,maxdeep,order,@c.calSDF,@(X) ones(size(X,1),1));% |||1 dV
|
|
SDir=fcmdv.calIntegral_S(Dirich_csg)
|
|
% Sstd=1;
|
|
% relaSD=(S0-Sstd)/Sstd
|
|
|
|
SNeu=fcmdv.calIntegral_S(Neuman_csg)
|
|
% S1std=0.25
|
|
% relaSN=(S1-S1std)/S1std
|
|
|
|
%% show model
|
|
clf;
|
|
c.set_display_args(Pst,Ped,pace/2,'viewxy',viewxy);
|
|
c.saveAs('c');
|
|
c.display_csg();
|
|
% c.set_display_args([Pst(1) 0 Pst(3)],Ped,pace/8,'viewxy',viewxy);
|
|
% c.csg2stl('./orgModel');
|
|
|
|
|
|
|
|
%% init mp(save handle)
|
|
mp=ModelPlus(Pst,Ped,pace,order,maxdeep);
|
|
mp.c=c;
|
|
mp.Dirich_csg=Dirich_csg;
|
|
mp.Neuman_csg=Neuman_csg;
|
|
mp.V0=V0;
|
|
mp.viewxy=viewxy;
|
|
mp.E=2e11*1e-3;
|
|
mp.u=0.3;
|
|
if 1 && order<3
|
|
saveKeH=SaveKe(mp,@compute_B_in_local,mp.pace,mp.order,mp);
|
|
mp.saveKe=saveKeH;
|
|
end
|
|
|
|
%% set args here
|
|
mp.fixedDir=1;
|
|
mp.fixedNeu=1;
|
|
mp.iscontrast=0;
|
|
mp.isrecord=1;
|
|
mp.frac=0.9;
|
|
mp.maxloop=40;
|
|
mp.interp_eeps=pace/(2^(maxdeep-1));
|
|
mp.interp_eeps=pi/2/2000;
|
|
%% save handle here
|
|
for i=1:length(cyObjs)
|
|
mp.handleMap(['cyObj' num2str(i)])=cyObjs(i);
|
|
end
|
|
mp.handleMap('lenObj')=length(cyObjs);
|
|
|
|
%% init fmt
|
|
tic
|
|
fmt=FeatureMappingTable(c,Pst,Ped,pace);
|
|
fmt.reflash_table();
|
|
tini=toc;
|
|
mp.recorder.time_maintain_fmt(end+1)=tini;
|
|
mp.fmt=fmt;
|
|
fprintf('num_node: %f\n',mp.id_cnt);
|
|
|
|
%% init x
|
|
x0=[];
|
|
lb=[];
|
|
ub=[];
|
|
for cyObj=cyObjs
|
|
x0=[x0 cyObj.rootH.x cyObj.rootH.y cyObj.rootH.z cyObj.rootH.tx cyObj.rootH.ty cyObj.rootH.r cyObj.rootH.h];
|
|
lb=[lb 0 0 0 -pi/2 -pi/2 0 0];
|
|
ub=[ub 10 20 10 pi/2 pi/2 cyObj.rootH.r*1.5 15];
|
|
end
|
|
x0=x0';
|
|
lb=lb';
|
|
ub=ub';
|
|
%---------------------------------end fill
|
|
|
|
mp.handleMap('x0')=x0;
|
|
mp.handleMap('lb')=lb;
|
|
mp.handleMap('ub')=ub;
|
|
mp.handleMap('modify_func')=@modify_c_by_x;
|
|
mp.handleMap('constrast_list')= ...
|
|
{};
|
|
modify_c_by_x(x0,mp);
|
|
|
|
end
|
|
|
|
|
|
function modify_c_by_x(x,mp)
|
|
Len=mp.handleMap('lenObj');
|
|
for i=1:Len
|
|
curObj=mp.handleMap(['cyObj' num2str(i)]);
|
|
curObj.rootH.x=x(i*7-6);
|
|
curObj.rootH.y=x(i*7-5);
|
|
curObj.rootH.z=x(i*7-4);
|
|
curObj.rootH.tx=x(i*7-3);
|
|
curObj.rootH.ty=x(i*7-2);
|
|
curObj.rootH.r=x(i*7-1);
|
|
curObj.rootH.h=x(i*7);
|
|
if(abs(curObj.rootH.r)<0.2)
|
|
curObj.rootH.r=0;
|
|
end
|
|
if(abs(curObj.rootH.h)<0.2)
|
|
curObj.rootH.h=0;
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
function ret=cal_NeuF(X)
|
|
|
|
lenX=size(X,1);
|
|
% 1 N
|
|
ret=[zeros(lenX,2),ones(lenX,1)*-1e3];
|
|
|
|
end
|
|
|
|
|