Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在三维曲面上绘制图线_Matlab - Fatal编程技术网

Matlab 在三维曲面上绘制图线

Matlab 在三维曲面上绘制图线,matlab,Matlab,我需要在matlab中绘制三维曲面上的线。我写了两个脚本,一个用于绘制曲面,另一个用于绘制曲面上的线条。 脚本1 脚本2 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 = [];

我需要在matlab中绘制三维曲面上的线。我写了两个脚本,一个用于绘制曲面,另一个用于绘制曲面上的线条。 脚本1

脚本2

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
函数绘图步骤(figHandle、funcHandle、P1、P2)
图(figHandle);
等等
图3(P1(1)、P1(2)、FunchHandle([P1(1);P1(2)],“r*”);
if~isequal(P1,P2)
Z=[];
X=[];
Y=[];
d=[P2(1)-P1(1),P2(2)-P1(2)];
如果(P1(1)P2(1)
X=P1(1):-0.0001:P2(1);
如果(P1(2)~=P2(2))
Y=X.*(d(2)/d(1))+(P1(2)-(d(2)/d(1))*P1(1));
其他的
对于i=X
Y=[Y,P1(2)];
结束
结束
其他的
如果P1(2)
我的问题是,无论彼此之间的距离有多近,在放大直线后,我都会使形成直线的点看起来不是连续的。

解决这个问题的最简单方法是将管线稍微抬离表面

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

但是,您可能必须尝试使用偏移量。有时,它可以使线条更宽一点,也可以尝试不同的渲染器。

谢谢@David,这样可能就可以了。但我有一个不同的想法。问题可能会出现,因为matlab选择了一个高次多项式来拟合形成直线的点。这会导致某些线点将位于三维曲面的下方,并在该曲面变平。如果我可以改变近似方法,让matlab在点之间使用线性近似,那么这将解决所有凸函数的问题。你知道怎么做吗?我不确定,但是你可以通过绘制更多的数据点来减少影响。如果没有/无法获得更多数据,可以通过线性插值创建更多数据。
plot3(X, Y, Z+1, 'r', 'LineWidth', 2);