clc; clear; close all;


% 用"单位球面 → 张量作用后变形"的方式可视化二阶张量
% 对比：1. 各向同性（isotropic） 2. 各向异性（anisotropic）主轴拉伸 
%      3. 剪切张量             4. 一般非对称张量（可选）



%% ===============================
% 1. 生成单位球面
% ===============================
n = 40;  % 分辨率
[x, y, z] = sphere(n);

% 转为向量形式
pts = [x(:), y(:), z(:)]';

%% ===============================
% 2. 定义几类二阶张量
% ===============================

% (1) 各向同性张量：单位矩阵
T_iso = eye(3);

% (2) 各向异性（主轴拉伸）
T_aniso1 = diag([2, 1, 0.5]);

% (3) 剪切张量
T_shear = [1 1 0;
           0 1 0;
           0 0 1];

% (4) 一般张量（非对称）
T_general = [1 0.5 0;
             -0.2 1 0.3;
             -1 0 1];

% cell循环
T_list = {T_iso, T_aniso1, T_shear, T_general};
titles = {'Isotropic', 'Anisotropic (Stretch)', ...
          'Shear Tensor', 'General Tensor'};

%% ===============================
% 3. 可视化
% ===============================
figure('Color','w','Position',[100 100 1200 900]);

for k = 1:length(T_list)

    T = T_list{k};

    % 张量作用
    pts_new = T * pts;

    % reshape回网格
    X = reshape(pts_new(1,:), size(x));
    Y = reshape(pts_new(2,:), size(y));
    Z = reshape(pts_new(3,:), size(z));

    % 子图
    subplot(2,2,k);

    % 原始球（灰色透明）
    surf(x, y, z, ...
        'FaceAlpha',0.1, ...
        'EdgeColor','none', ...
        'FaceColor',[0.6 0.6 0.6]);
    hold on;

    % 变形后
    surf(X, Y, Z, ...
        'FaceAlpha',0.8, ...
        'EdgeColor','none');

    % 坐标轴
    axis equal;
    grid on;
    xlabel('x'); ylabel('y'); zlabel('z');

    title(titles{k});

    % 光照增强立体感
    camlight;
    lighting phong;
end

%% 动态演示
figure('Color','w','Position',[100 100 1200 900]);

for t = linspace(0,1,50)

    T = diag([1+t, 1, 1-t]); % 从各向同性到各向异性

    pts_new = T * pts;

    X = reshape(pts_new(1,:), size(x));
    Y = reshape(pts_new(2,:), size(y));
    Z = reshape(pts_new(3,:), size(z));

    surf(X,Y,Z);
    axis equal;
    drawnow;
    pause(0.01)
end


