该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
function hypercube( N, a, b, c)
%N为立方体维数,N不小于3
% a为投影方式,b为是否画面,c为是否旋转
%取值 1 点投影 画平面 旋转
%取值 0 平行投影 不画平面 不旋转
%-----------------------------------------------
a=logical(a);
b=logical(b);
c=logical(c);
B=orth(rand(N,N));%每一列是N维正交规范基,共N个
%B=eye(N);%也可以使用单位矩阵
P=zeros(N,2^N);%2^N个N维顶点,每一列用于储存一点的坐标
for j=1:2^N
%第j列,对应j-1的二进制数
for i=1:N
P(i,j)=bitget(j-1,i);%每一列储存不同的二进制数(0-1组合)
end
end
RMP=RM(P);%可达矩阵,true表示距离为1
P=B*P;%每一列为一点的坐标
CT=mean(P,2);%中心点坐标,列向量
P=P-CT*ones(1,2^N);%平移,中心与原点重合
%-------------------------------------------------
if c %有运动
de=2;%旋转角度
C=eye(N);%过渡矩阵C
C1=[cosd(de),sind(de); -sind(de),cosd(de)];%旋转矩阵
C([N-1,N],[N-1,N])=C1;
K=1000;
else %没有运动
K=1;
end
for k=1:K
if a %点投影
PTY=P;%储存投影后坐标
for j=1:2^N
PTY(:,j)=2*PTY(:,j)./(2-PTY(N,j));
end
PXYZ=PTY(1:3,:);
else %平行投影
PXYZ=P(1:3,:);
end
plot3(PXYZ(1,:),PXYZ(2,:),PXYZ(3,:),'r*');
axis([-1.5,1.5,-1.5,1.5,-1.5,1.5]);
hold on
if b %选四点,根据距离画平面
for i4=4:2^N
for i3=3:i4-1
for i2=2:i3-1
for i1=1:i2-1
M4=RMP([i1,i2,i3,i4],[i1,i2,i3,i4]);%4点的可达矩阵
if all(sum(M4)==3)
mysurf(PXYZ(:,[i1,i2,i3,i4]));
end
end
end
end
end
else %选两点,根据距离画线
for i=1:2^N
for j=1:i-1
if RMP(i,j)
plot3( PXYZ(1,[i,j]), PXYZ(2,[i,j]), PXYZ(3,[i,j]),'b-');
end
end
end
end
title([num2str(N),'维立方体']);
xlabel('X轴');
ylabel('Y轴');
zlabel('Z轴');
grid on
hold off
pause(0.01);
if c
P=C*P;%坐标旋转变换
end
end
end
function RMA= RM(A)
%构造n*n可达矩阵
%每一列为点的坐标
n=size(A,2);%点数
RMA=zeros(n,n);
for i=2:n
for j=1:i-1
RMA(i,j)=sum(abs(A(:,i)-A(:,j)));
end
end
RMA=RMA+RMA';
RMA=RMA<1.1;
end
function output = mysurf( A )
%输入四个点画平面
%A是3*4矩阵,三行分别代表X Y Z ,每一列为一点坐标
A=A';
X=[A([1,2],1),A([3,4],1)];
Y=[A([1,2],2),A([3,4],2)];
Z=[A([1,2],3),A([3,4],3)];
output=surf(X,Y,Z);
alpha(0.25);%不透明度
colormap([0,0,1]);%蓝色
end