Dynamic-Calibration/utils/YALMIP-master/extras/isconvexmeshdata.m

50 lines
1.3 KiB
Matlab
Executable File

function [isconvexorconcave,A,B] = isconvexmeshdata(xi,yi,zi)
[n,m] = size(xi);
% Go through all triangles
isconvex = 1;
isconcave = 1;
A = [];
B = [];
for i = 1:n-1
for j = 1:m-1
x1 = [xi(i,j);yi(i,j);zi(i,j)];
x2 = [xi(i,j+1);yi(i,j+1);zi(i,j+1)];
x3 = [xi(i+1,j);yi(i+1,j);zi(i+1,j)];
temp = null([[x1';x2';x3'] ones(3,1)]);
a = temp(1:3);
b = temp(4);
if a(3) < 0
a = -a;
b = -b;
end
isconvex = isconvex && all(a'*[xi(:)';yi(:)';zi(:)']+b >= -1e-10);
isconcave = isconcave && all(a'*[xi(:)';yi(:)';zi(:)']+b <= 1e-10);
A = [A a];
B = [B b];
x3 = [xi(i+1,j+1);yi(i+1,j+1);zi(i+1,j+1)];
x2 = [xi(i,j+1);yi(i,j+1);zi(i,j+1)];
x1 = [xi(i+1,j);yi(i+1,j);zi(i+1,j)];
temp = null([[x1';x2';x3'] ones(3,1)]);
a = temp(1:3);
b = temp(4);
if a(3) < 0
a = -a;
b = -b;
end
isconvex = isconvex && all(a'*[xi(:)';yi(:)';zi(:)']+b >= -1e-10);
isconcave = isconcave && all(a'*[xi(:)';yi(:)';zi(:)']+b <= 1e-10);
A = [A a];
B = [B b];
if ~isconvex && ~isconcave;
break
end
end
end
% 0 : Neither, 1 Convex -1 Concave
isconvexorconcave = isconvex-isconcave;