为什么旋转在此代码中不起作用

时间:2015-08-19 15:37:28

标签: matlab ellipse rotational-matrices

我的问题是围绕原点旋转椭圆体模型。我正在使用旋转矩阵,但答案看起来不错。你能告诉我问题出在哪里吗? 以下是我的代码。我首先定义了区域和网格大小。 Alpha,Beta,Gamma是围绕X,Y,Z轴的旋转。我计算新坐标(旋转坐标)中的椭球半径,然后逐点检查它们是否与椭球公式一致,以定义epsilon矩阵,这是我基于点位置的目标。最后,我绘制了XY,XZ,YZ平面的epsilon矩阵。这适用于alpha,beta,theta = 0和90度,但对于其他角度,则没有可重新密封的答案。您认为哪里是错误?

仅供参考:此代码是FDTD方法麦克斯韦方程求解器的一部分。

谢谢,

nx=209; ny=209; nz=209;
x_lower=1 ; y_lower=1 ; z_lower=1 ;
x_upper=nx ; y_upper=ny ; z_upper=nz ;
dz=2.366863905325444E-008 ; dy=2.366863905325444E-008 ; dx=2.366863905325444E-008 ;
k_mid=(nz+1-1)/2+1; j_mid=(ny+1-1)/2+1; i_mid=(nx+1-1)/2+1;

x_cyto=0 ; y_cyto=0 ; z_cyto=0 ;
r_cell=2e-6;

alpha=0;
beta=0;
gamma=0;

temp_1=1.334 ; temp_2=1.35;
a_cyto=1e-6 ; b_cyto=1e-6 ; c_cyto=1e-6 ;

temp_3=1.39;
a_nucl=1e-6 ; b_nucl=1.5e-6 ; c_nucl=1e-6 ;
x_nucl=0 ; y_nucl=0 ; z_nucl=0 ;

a_cyto_prime=(a_cyto*(cosd(beta)*cosd(gamma)))-(b_cyto*(cosd(beta)*sind(gamma)))+(c_cyto*(sind(beta)));
b_cyto_prime=(a_cyto*((sind(alpha)*sind(beta)*cosd(gamma))+(cosd(alpha)*sind(gamma))))+...
    (b_cyto*(-(sind(alpha)*sind(beta)*sind(gamma))+(cosd(alpha)*cosd(gamma))))+...
    (c_cyto*(-sind(alpha)*cosd(beta)));
c_cyto_prime=(a_cyto*(-(cosd(alpha)*sind(beta)*cosd(gamma))+(sind(alpha)*sind(gamma))))+...
    (b_cyto*(+(cosd(alpha)*sind(beta)*sind(gamma))+(sind(alpha)*cosd(gamma))))+...
    (c_cyto*(cosd(alpha)*cosd(beta)));

for k=z_lower:z_upper
    z=dz*(k-k_mid);
    z2=(z-z_cyto)^2;
    for j=y_lower:y_upper
        y=dy*(j-j_mid);
        y2=(y-y_cyto)^2;
        for i=x_lower:x_upper
            x=dx*(i-i_mid);
            x2=(x-x_cyto)^2;            

            if (x2*b_cyto_prime*b_cyto_prime*c_cyto_prime*c_cyto_prime)+...
                    (y2*a_cyto_prime*a_cyto_prime*c_cyto_prime*c_cyto_prime)+...
                    (z2*a_cyto_prime*a_cyto_prime*b_cyto_prime*b_cyto_prime)<=...
                    (a_cyto_prime*a_cyto_prime*b_cyto_prime*b_cyto_prime*c_cyto_prime*c_cyto_prime)

                epsilon(i,j,k)=temp_2;
                mu(i,j,k)=1;
                %             if (sqrt(x2+y2+z2)>=r_cell)
                %                 epsilon(i,j,k)=temp_1;
                %                 mu(i,j,k)=1;
                %             else
                %                 epsilon(i,j,k)=temp_2;
                %                 mu(i,j,k)=1;
                %             end
            else
                epsilon(i,j,k)=temp_1;
                mu(i,j,k)=1;
            end
        end
    end
end
eps_2D_YZ(1:x,1:x)=epsilon(round(x/2),:,:);
eps_2D_XZ(1:x,1:x)=epsilon(:,round(x/2),:);
eps_2D_XY(1:x,1:x)=epsilon(:,:,round(x/2));

x=length(eps_2D_XY);

subplot(1,3,1); surf(-round((x-1)/2):round((x-1)/2),-round((x-1)/2):round((x-1)/2),eps_2D_XY); title('XY'); view(2); axis equal tight;
subplot(1,3,2); surf(-round((x-1)/2):round((x-1)/2),-round((x-1)/2):round((x-1)/2),eps_2D_XZ); title('XZ'); view(2); axis equal tight;
subplot(1,3,3); surf(-round((x-1)/2):round((x-1)/2),-round((x-1)/2):round((x-1)/2),eps_2D_YZ); title('YZ'); view(2); axis equal tight;

0 个答案:

没有答案