Dynamic-Calibration/utils/YALMIP-master/extras/@lmi/plotlattice.m

89 lines
2.1 KiB
Mathematica
Raw Permalink Normal View History

2019-12-18 11:25:45 +00:00
function varargout = plotlattice(varargin)
%PLOTLATTICE Plots an integer lattice
%
% p = plotlattice(C,which,c,size,options)
%
% Note that only convex sets C in R^2 are supported.
%
% C : Constraint object
% which: 'inner' or 'outer'
% color: color [double] ([r g b] format) or char from 'rymcgbk'
% size : Size of marker
% options: options structure from sdpsettings
% Example
% sdpvar x1 x2
% plot(x1^2+x2^2 <= 1.5,'green');hold on
% plotlattice(x1^2+x2^2 <= 1.5,'outer','yellow');
% plotlattice(x1^2+x2^2 <= 1.5,'inner','black');
F = varargin{1};
if nargin > 1
which = varargin{2};
else
which = 'outer';
end
if nargin > 2
color = varargin{3};
else
color = 'yellow';
end
if nargin > 3
size = varargin{4};
else
size = 5;
end
if nargin > 4
ops = varargin{5};
if ~isempty(ops)
ops = sdpsettings(ops,'relax',2,'verbose',0);
else
ops = sdpsettings('relax',2,'verbose',0);
end
else
ops = sdpsettings('relax',2,'verbose',0);
end
X = recover(depends(F));
[~,L,U] = boundingbox(F,ops);
x = floor(L(1)):ceil(U(1));
y = floor(L(2)):ceil(U(2));
ThreeD = length(L)>2;
if ThreeD
z = floor(L(3)):ceil(U(3));
else
z = 1;
end
for i = x
for j = y
for k = z
switch which
case 'outer'
if ThreeD
l = plot3(i,j,k,'or','MarkerSize',size);
else
l = plot(i,j,'or','MarkerSize',size);
end
set(l,'MarkerFaceColor',color);
case 'inner'
if ThreeD
assign(X,[i;j;k]);
else
assign(X,[i;j]);
end
p = checkset(F);
if min(p) >= 0
if ThreeD
l = plot3(i,j,k,'or','MarkerSize',size,'MarkerFaceColor','yellow');
else
l = plot(i,j,'or','MarkerSize',size,'MarkerFaceColor','yellow');
end
set(l,'MarkerFaceColor',color);
end
otherwise
error
end
end
end
end