在 MATLAB 中用非笛卡尔坐标画一条线

Draw a line with non-Cartesian coordinates in MATLAB

MATLAB 的 surf 命令允许您将指定非笛卡尔 x-y 分量的可选 XY 数据传递给它。 (他们本质上改变了基础向量)。我希望将类似的参数传递给将画一条线的函数。

如何使用非笛卡尔坐标系绘制直线?

如果我的术语有点不对,我深表歉意。这在技术上仍然可能是笛卡尔 space 但它不会是 正方形 在 x 方向上的一个单位与 y 方向上的一个单位正交的意义上.如果您能纠正我的术语,我将不胜感激!

编辑:

下面更好地说明了我的意思:

命令:

datA=1:10;
datB=1:10;
X=cosd(8*datA)'*datB;
Y=datA'*log10(datB*3);
Z=ones(size(datA'))*cosd(datB);
XX=X./(1+Z);
YY=Y./(1+Z);
surf(XX,YY,eye(10)); view([0 0 1])

生成下图:

此处,X 和 Y 维度既不正交也不等 spaced。 x 中的一个单位可以对应于 x 方向上的 5 cm,但 x 中的下一个单位可以对应于 x 方向上的 2 cm + y 方向上的 1 cm。 我希望复制此功能,但画一条线而不是冲浪例如,我正在寻找一个函数,其中:

straightLine=[(1:10)' (1:10)'];
my_line(XX,YY,straightLine(:,1),straightLine(:,2))

会生成一条描绘冲浪图上红色方块的线。

Matlab 有许多内置函数可以帮助您。

在 2D 中,最简单的方法是 polar,它允许您使用 thetarho 向量制作图形:

theta = linspace(0,2*pi,100);
r = sin(2*theta);
figure(1)
polar(theta, r), grid on

所以,你会得到 this. 还有 pol2cart 函数可以将您的数据转换为 xy 格式:

[x,y] = pol2cart(theta,r);
figure(2)
plot(x, y), grid on

这样看起来会稍微有点different 然后,如果我们将其扩展到 3D,则只剩下 plot3。所以,如果你有这样的数据:

theta = linspace(0,10*pi,500);
r = ones(size(theta));
z = linspace(-10,10,500);

您需要使用带有 3 个参数的 pol2cart 来生成 this: [x,y,z] = pol2cart(theta,r,z); 图(3) plot3(x,y,z),网格

最后,如果你有球形数据,你有 sph2cart:

theta = linspace(0,2*pi,100);
phi = linspace(-pi/2,pi/2,100);
rho = sin(2*theta - phi);
[x,y,z] = sph2cart(theta, phi, rho);
figure(4)
plot3(x,y,z),grid on
view([-150 70])

那会看起来 this way

我仍然不确定你输入的数据是关于什么的,以及你想要绘制什么。但是,从如何你想绘制它,我可以提供帮助。

当你打电话时

surf(XX,YY,eye(10)); view([0 0 1]);

并且只想获得 "red parts",即函数的最大值,您实际上是 selecting XXYY 矩阵的一个子集,使用对角矩阵作为指标。所以你可以手动 select 这些点,并使用 plot 将它们绘制成一条线:

Xplot = diag(XX);
Yplot = diag(YY);
plot(Xplot,Yplot,'r.-');

diag(XX) 的调用将获取矩阵 XX 的对角线元素,这正是您将 surfz 数据根据 eye().

结果:


此外,如果您只是想按照示例中的说明进行操作,则无需使用矩阵来最终取出对角线。这是相同的结果,对输入向量使用逐元素运算:

datA = 1:10;
datB = 1:10;
X2 = cosd(8*datA).*datB;
Y2 = datA.*log10(datB*3);
Z2 = cosd(datB);
XX2 = X2./(1+Z2);
YY2 = Y2./(1+Z2);
plot(Xplot,Yplot,'rs-',XX2,YY2,'bo--','linewidth',2,'markersize',10);
legend('original','vector')

结果: