73 lines
1.5 KiB
Mathematica
73 lines
1.5 KiB
Mathematica
|
|
function varargout = plothyperplanes(varargin)
|
||
|
|
%PLOTLATTICE Draws the hyperplanes of a polytope
|
||
|
|
%
|
||
|
|
% p = plothyperplanes(P,color,D)
|
||
|
|
%
|
||
|
|
% Note that only polytopes in R^2 are supported.
|
||
|
|
%
|
||
|
|
% C : Constraint object
|
||
|
|
% color: color [double] ([r g b] format) or char from 'rymcgbk'
|
||
|
|
% D : Region over which plot is generated. Based on bounding box if not supplied
|
||
|
|
|
||
|
|
P = varargin{1};
|
||
|
|
|
||
|
|
if length(depends(P)) > 2
|
||
|
|
error('PLOTHYPERPLANES is only applicable in 2D');
|
||
|
|
end
|
||
|
|
|
||
|
|
if nargin > 1
|
||
|
|
color = varargin{2};
|
||
|
|
if isempty(color)
|
||
|
|
color = 'blue';
|
||
|
|
end
|
||
|
|
else
|
||
|
|
color = 'blue';
|
||
|
|
end
|
||
|
|
if nargin > 2
|
||
|
|
domain = varargin{3};
|
||
|
|
X = recover(depends(domain));
|
||
|
|
[~,L,U] = boundingbox(domain);
|
||
|
|
oldL = L;
|
||
|
|
oldU = U;
|
||
|
|
else
|
||
|
|
domain = P;
|
||
|
|
X = recover(depends(P));
|
||
|
|
[~,L,U] = boundingbox(P);
|
||
|
|
oldL = L;
|
||
|
|
oldU = U;
|
||
|
|
% Explode the box
|
||
|
|
C = (U+L)/2;
|
||
|
|
W = (U-L)/2;
|
||
|
|
U = C+1.5*W;
|
||
|
|
L = C-1.5*W;
|
||
|
|
end
|
||
|
|
|
||
|
|
bA = getbase(sdpvar(P));
|
||
|
|
ls = [];
|
||
|
|
for i = 1:size(bA,1);
|
||
|
|
b = bA(i,1);
|
||
|
|
a = -bA(i,2:end);
|
||
|
|
if a(1) == 0
|
||
|
|
p1 = [L(1) b/a(2)];
|
||
|
|
p2 = [U(1) b/a(2)];
|
||
|
|
elseif a(2) == 0
|
||
|
|
p1 = [b/a(1) L(2)];
|
||
|
|
p2 = [b/a(1) U(2)];
|
||
|
|
else
|
||
|
|
p1 = [L(1) (b-a(1)*L(1))/a(2)];
|
||
|
|
p2 = [U(1) (b-a(1)*U(1))/a(2)];
|
||
|
|
end
|
||
|
|
l = line([p1(1) p2(1)],[p1(2) p2(2)]);
|
||
|
|
set(l,'color',color);
|
||
|
|
ls = [ls l];
|
||
|
|
end
|
||
|
|
% L = oldL;
|
||
|
|
% U = oldU;
|
||
|
|
% C = (L+U)/2;W = (U-L)/2;
|
||
|
|
% L = C-2*W;
|
||
|
|
% U = C+2*W;
|
||
|
|
axis([L(1) U(1) L(2) U(2)])
|
||
|
|
varargout{1} = ls;
|
||
|
|
|
||
|
|
|
||
|
|
|