各位大虾: 我导入TXT点坐标文件 2012-4-10 17:16 上传
点击文件名下载附件
点文件 画曲面,按理最外部的点决定曲面的轮廓,可我画出来的超过了,也不知道问题处在哪。下面是我的代码: clc; clear; load points.txt; %points.txt文件放在matlab安装的work夹里% x=points(:,1); y=points(:,2); z=points(:,3); [X,Y]=meshgrid(min(x):1:max(x),min(y):1:max(y)); Z=griddata(x,y,z,X,Y,'v4'); figure(1); surf(X,Y,Z,'facecolor','interp','edgecolor','none','facelighting','phong'); hold on; plot3(x,y,z,'*'); 得到的曲面和点图为 曲面轮廓超过最外边的点了。。。哪错了?有解决办法不?坐等高手解决,十分感谢。。学习matlab总能遇到意想不到的问题,习惯拿到论坛里来请教,因为坛里高手还是很多的。。。哈哈。交流才能学到东西,这是我加入这论坛最大的收获。欢迎来顶我:loveliness: |
6 条回复
本帖最后由 meatball1982 于 2012-4-14 11:10 编辑 因为你生成 的曲面的X,Y坐标就已经超过点的范围了啊。 [X,Y]=meshgrid(min(x):1:max(x),min(y):1:max(y)); 从图中可以看出,有一部分是是散点的范围之外, clc; clear; load points.txt; %points.txt文件放在matlab安装的work夹里% x=points(:,1); y=points(:,2); z=points(:,3); [X,Y]=meshgrid(min(x):1:max(x),min(y):1:max(y)); Z=griddata(x,y,z,X,Y,'v4'); surf(X,Y,Z,'facecolor','interp','edgecolor','none','facelighting','phong'); hold on; mesh(X,Y,zeros(size(X)))%可以看出你用于拟合的曲面的范围。 plot3(x,y,z,'*'); 注意红色框的部分,就是你生成的,超出散点的范围 |
本帖最后由 meatball1982 于 2012-4-16 13:57 编辑 可能是我没有说清楚。抛开你的数据,用下面的程序说明一下。 在[-0.5 0.5]*[-0.5,0.5]的范围内,有一些散点。我要用它们开griddata 一个网格中的曲面。 我希望生成的点,都在[-0.5 0.5]*[-0.5,0.5]的范围内。 如果我用一个更大的网络生成,比如[-0.7 0.7]*[-0.7,0.7],那么生成的曲面的边界就在[-0.7,0.7]*[-0.7,0.7]这个范围内了。而你觉得如果超出[-0.5 0.5]*[-0.5,0.5]的范围就不对了。 n=100; x_n=rand(n,1)-0.5; y_n=rand(n,1)-0.5; z_n=x_n.^2+y_n.^2+rand(n,1)*0.02; x_line=[-0.7:0.1:0.7]; y_line=[-0.7:0.1:0.7]; [X,Y]=meshgrid(x_line,y_line); Z=griddata(x_n,y_n,z_n,X,Y,'v4'); ind=(X<0.5)&(X>-0.5)&(Y<0.5)&(Y>-0.5) Z_new=Z; Z_new(~ind)=NaN; figure(1) mesh(X,Y,Z) hold on hidden off plot3(x_n,y_n,z_n,'.'); grid on hold off figure(2) mesh(X,Y,Z_new) hold on hidden off plot3(x_n,y_n,z_n,'.'); grid on hold off 我的思路是找出在之前数据范围内的点(我暂时是用z的最小值进行判断的,实际上你应该是判断图中红色的范围这些点不在你之前数据的范围之内),把剩下的点都变成NaN(Not a number),这样画出来的图就对了。 clc; clear; load points.txt; %points.txt文件放在matlab安装的work夹里% x=points(:,1); y=points(:,2); z=points(:,3); [X,Y]=meshgrid(min(x):1:max(x),min(y):1:max(y)); Z=griddata(x,y,z,X,Y,'v4'); ind=(Z>min(z)); Z(~ind)=NaN; surf(X,Y,Z,'facecolor','interp','edgecolor','none','facelighting','phong'); hold on; % mesh(X,Y,zeros(size(X))) % plot(x,y,'*') plot3(x,y,z,'*'); hidden off 不知道这次说清楚了没,你要自己判断生成数据哪些在你要的范围之内,判断的依据由你自己来定义。把剩下的数据画出来就好了。 |
红色部分应该被设为Nan
Powered by Discuz! X3.4
© 2001-2024