MATLAB中三维三角曲面的有序等值线计算

时间:2018-01-12 12:54:45

标签: matlab sorting contour triangulation

我需要从MATLAB中使用三角网格定义的3D表面中提取4D变量的等值线坐标。我需要将等值坐标按这样的方式排序,即如果按顺序跟踪它们,它们将跟踪路径,即3D打印机将遵循的点的顺序。

enter image description here

我找到了一个可以计算这些等值线坐标的函数(参见Isoline函数here),但问题是这个函数没有考虑isolines以正确的顺序连接而是一系列的由Nan值分隔的2个点。这使得此功能仅适用于可视化目的,而不适用于遵循的路径。

这是一个简化问题的MWE,我应用它的表面也要复杂得多,我无法分享它。其中x,y和z是节点,TRI提供元素连通性列表,v是我想要从中提取等值线的变量,并且等于z。

如果有人对任何一个有任何想法.....

  1. 以3D三维网格的正确顺序提取等值线的函数。
  2. 如何对Isoline函数给出的数据进行排序,以使它们的顺序正确。
  3. ....非常感谢。

    这是MWE,

    % Create coordinates
    [x y] = meshgrid( -10:0.5:10, -10:0.5:10 );
    z = (x.^2 + y.^2)/20;    % Z height
    v = x+y;            % 4th dimension value
    
    % Reshape coordinates into list to be converted to tri mesh
    x = reshape(x,[],1); y = reshape(y,[],1); z = reshape(z,[],1); v = reshape(v,[],1);
    TRI = delaunay(x,y);    % Convertion to a tri mesh
    
    % This function calculates the isoline coordinates
    [xTows, yTows, zTows] = IsoLine( {TRI,[x, y, z]}, v, -18:2:18);
    
    % Plotting
    figure(1); clf(1)
    subplot(1,2,1)
    trisurf(TRI,x,y,z,v)
    hold on
    for i = 1:size(xTows,1)
        plot3( xTows{i,1}, yTows{i,1}, zTows{i,1}, '-k')
    end
    hold off
    shading interp
    xlabel('x'); ylabel('y'); zlabel('z'); title('Isolines'), axis equal
    
    %% This section is solely to show that the isolines are not in order
    for i = 1:size(xTows,1)
    
        % Arranging data into colums and getting rid of Nans that appear
        xb = xTows{i,1}; yb = yTows{i,1}; zb = zTows{i,1}; 
        xb = reshape(xb, 3, [])'; xb(:,3) = [];
        yb = reshape(yb, 3, [])'; yb(:,3) = [];
        zb = reshape(zb, 3, [])'; zb(:,3) = [];
    
        subplot(1,2,2)
        trisurf(TRI,x,y,z,v)
        shading interp
        view(2)
        xlabel('x'); ylabel('y'); zlabel('z'); title('Plotting Isolines in Order')
        axis equal; axis tight; hold on
        for i = 1:size(xb,1)
            plot3( [xb(i,1) xb(i,2)], [yb(i,1) yb(i,2)], [zb(i,1) zb(i,2)], '-k')
            drawnow
        end
    end
    

    这是Isoline的功能,我稍微有点过分了。

    function [xTows, yTows, zTows] = IsoLine(Surf,F,V,Col)
    
    if length(Surf)==3                % convert mesh to triangulation
      P = [Surf{1}(:) Surf{2}(:) Surf{3}(:)];
      Surf{1}(end,:) = 1i;
      Surf{1}(:,end) = 1i;
      i = find(~imag(Surf{1}(:)));
      n = size(Surf{1},1);
      T = [i i+1 i+n; i+1 i+n+1 i+n];
    else
      T = Surf{1};
      P = Surf{2};
    end
    f = F(T(:));
    if nargin==2
      V = linspace(min(f),max(f),22);
      V = V(2:end-1);
    elseif numel(V)==1
      V = linspace(min(f),max(f),V+2);
      V = V(2:end-1);
    end
    if nargin<4
      Col = 'k';
    end
    H = NaN + V(:);
    q = [1:3 1:3];
    % -------------------------------------------------------------------------
    
    % Loop over iso-values ----------------------------------------------------
    xTows = [];
    yTows = [];
    zTows = [];
    for k = 1:numel(V)
      R = {[],[]};
      G = F(T) - V(k);   
      C = 1./(1-G./G(:,[2 3 1]));
      f = unique(T(~isfinite(C))); % remove degeneracies by random perturbation
      F(f) = F(f).*(1+1e-12*rand(size(F(f)))) + 1e-12*rand(size(F(f)));
      G = F(T) - V(k);
      C = 1./(1-G./G(:,[2 3 1]));
      C(C<0|C>1) = -1;
      % process active triangles
      for i = 1:3
        f = any(C>=0,2) & C(:,i)<0;
        for j = i+1:i+2
          w = C(f,q([j j j]));
          R{j-i} = [R{j-i}; w.*P(T(f,q(j)),:)+(1-w).*P(T(f,q(j+1)),:)];
        end
      end
      % define isoline
      for i = 1:3
        X{i} = [R{1}(:,i) R{2}(:,i) nan+R{1}(:,i)]';
    %     X{i} = [R{1}(:,i) R{2}(:,i)]';    % Changed by Matt
        X{i} = X{i}(:)';
      end
      % plot isoline
      if ~isempty(R{1})
    %     hold on
    %     H(k) = plot3(X{1},X{2},X{3},Col);
    
        % Added by M.Thomas
        xTows{k,1} = X{1};
        yTows{k,1} = X{2};
        zTows{k,1} = X{3};
    
      end
    end
    

    你会注意到isolines(xTows,yTows和zTows)不在那里&#34;跳转&#34;当顺序绘制时。我需要对排序进行排序,以便按顺序给出平滑的情节。

0 个答案:

没有答案