2014-04-27 2 views
0

나는 MATLAB에서 3D 표면에 선을 그려야합니다. 표면을 그리기위한 두 개의 스크립트와 표면의 선을 그리는 스크립트를 썼습니다. 3D 표면에 plottnig 라인

function figHandle = plotFunction(funchandle, a , b) 
    x_vec = -a:.1:a; 
    y_vec = -b:.1:b; 
    figHandle = figure(); 
    [X,Y] = meshgrid(x_vec, y_vec); 
    Z = []; 
    z_temp = []; 
    for i = x_vec 
     for j = y_vec 
      z_temp =[z_temp; funchandle([i; j])]; 
     end; 
     Z = [Z, z_temp]; 
     z_temp = []; 
    end; 
    h = surf(X,Y,Z); 
    set(h, 'edgecolor', 'none'); 
    %colormap gray; 
    colorbar; 
    view(0,90); 
end 

script1이

script2

function plotStep(figHandle,funcHandle, P1, P2) 
    figure(figHandle); 
    hold on; 
    plot3(P1(1), P1(2), funcHandle([P1(1);P1(2)]), 'r*'); 
    if ~isequal(P1,P2) 
     Z = []; 
     X = []; 
     Y = []; 
     d = [P2(1)-P1(1), P2(2) - P1(2)]; 
     if (P1(1) < P2(1)) 
      X = P1(1):0.0001:P2(1); 
      if (P1(2) ~= P2(2)) 
       Y = X.*(d(2)/d(1))+(P1(2)-(d(2)/d(1))*P1(1)); 
      else 
       for i = X 
        Y = [Y, P1(2)]; 
       end 
      end 
     elseif P1(1) > P2(1) 
      X = P1(1):-0.0001:P2(1); 
      if (P1(2) ~= P2(2)) 
       Y = X.*(d(2)/d(1))+(P1(2)-(d(2)/d(1))*P1(1)); 
      else 
       for i = X 
        Y = [Y, P1(2)]; 
       end 
      end 
     else 
      if P1(2) < P2(2) 
       Y = P1(2):0.0001:P2(2); 
       for i = Y 
        X = [X, P1(1)]; 
       end 
      else 
       Y = P1(2):-0.0001:P2(2); 
       for i = Y 
        X = [X, P1(1)]; 
       end 
      end 
     end 

     for i = 1:length(X) 
      Z = [Z;funcHandle([X(i);Y(i)])]; 
     end 
     plot3(X, Y, Z, 'r', 'LineWidth', 2); 

    end 

내 문제에 상관없이 나는 계속 될 것 같지 않습니다 라인에 확대 한 후 라인을 형성하는 점을 어떻게 서로 너무 가까이하지 않습니다. before zooming in after zooming in

답변

0

이 문제를 해결하는 가장 간단한 방법은, 조금 표면 떨어져

plot3(X, Y, Z+1, 'r', 'LineWidth', 2); 

을 라인을 마련하는 것입니다하지만 당신은 오프셋을 실험 할 수 있습니다. 라인을 조금 넓히고 다른 렌더러를 사용해 보는 것도 도움이 될 수 있습니다.

+0

감사합니다. @David, 가능합니다. 그러나 나는 다른 생각을 가지고있다. MATLAB은 선을 형성하는 점에 맞게 높은 차수의 다항식을 선택하기 때문에 문제가 발생할 수 있습니다. 이로 인해 라인 포인트 중 일부가 3D 표면 아래로 떨어지면서 평평 해집니다. 그 근사법을 바꿀 수 있다면, matlab은 점들 사이의 선형 근사를 사용하기 때문에 모든 convex 함수에 대한 문제를 해결할 수 있습니다. 이 작업을 수행하는 방법을 알고 있습니까? – Lukasz

+0

확실하지 않지만 더 많은 데이터 포인트를 플로팅하여 효과를 줄일 수 있습니다. 더 많은 데이터를 얻지 못하면 선형 보간법으로 더 많은 데이터를 생성 할 수 있습니다. – David

관련 문제