【问题标题】:How can I generate spheres from points in MATLAB?如何从 MATLAB 中的点生成球体?
【发布时间】:2017-05-03 08:21:17
【问题描述】:

我在 MATLAB 中生成了随机 3D 点。点数组的长度在每次运行时都会发生变化。我想把这些点变成球体。但是,我还没有成功。我点的散点图是这样的:

每个点都用 x、y 和 z 表示。现在,我想使用 x、y 和 z 作为中心点并生成半径为 r 的球体?我该怎么做?

给你一个想法,一张示例图片来展示我期望生成的内容:

【问题讨论】:

  • @Wolfie:潜在的“破坏”如何?
  • @Wolfie 我不认为你被告知了。 Adriaan 要求您澄清编辑的理由。
  • @Wolfie:我注意到您的编辑消息“使用带有感叹号的 SO 上传,而不是 imgur”。据我了解,上传系统确实使用了 imgur.com。我怀疑 Stack Exchange 和 Imgur 有商业安排。
  • 啊,我明白你的意思了 - 是的,从编辑消息中并不清楚。不用担心,澄清一下就好了。

标签: matlab


【解决方案1】:

您可以使用内置的sphere,乘以半径并添加中心坐标。一次绘制它们你可以使用cellfun:

% number of spheres
n = 10;
% random xyz center points
xyz = rand(n,3)*10;
% random radius
r = rand(n,1);
% generate unit sphere (radius=1, center=[0,0,0])
[X,Y,Z] = sphere;
% plot function for all spheres
plotfun = @(c,r) surf(X*r + c(1),Y*r + c(2),Z*r + c(3));
% generate figure with "hold on"
figure;
hold on;
axis equal;
grid on;
% plot all spheres
h = cellfun(plotfun,num2cell(xyz,2),num2cell(r),'UniformOutput',0);

如果您想要类似于您想要的输出的球体,您可以向surf 添加一些图形属性并添加一个light 对象:

plotfun = @(c,r) surf(x*r + c(1),y*r + c(2),z*r + c(3),...
    'FaceColor',.7*[1 1 1],'EdgeColor','none',...
    'FaceLighting','gouraud','AmbientStrength',0.5);
light('Position',[-1 0 0]);

【讨论】:

  • sphere 的输出不应该是小写字母还是plotfun 的常量应该是大写?
  • 谢谢,plotfun 的常量应该是大写的,我编辑了我的答案。
  • 非常感谢您的回复。 c 是中心点数组,对吗?您的代码中的 x、y 和 z 是什么?随机坐标?
  • XYZ(大写)是“单位球体”坐标; xyz 是每个球心的随机 xyz 坐标; cplotfun = @(c,r) 一样是绘图函数输入,它是一个 3D 向量,表示球体中心的 xyz 坐标。
【解决方案2】:

假设您有一个点 (a1,a2,a3),并且您想绘制一个半径为 R 的球体,您可以这样做:

R=5;
a1=1;
a2=-2;
a3=3;
[x,y,z] = sphere;
surf((x+a1)*R,(y+a2)*R,(z+a3)*R) % centered at (a1,a2,a3) with radius R

我建议遍历您的数组并在每个点上执行此操作。请记住,您可以增加球体上的面数,请查看here 了解具体方法。

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多