2015-06-02 33 views
2

我希望能够在MATLAB中处理3D结构。我是MATLAB新手,在Google搜索后我没有看到这个问题的答案。你能像MATLAB那样在MATLAB中定义一个变量吗?

如果你想明确定义一个特定的球体,而不使用内置的球体函数,这将如何工作?例如,是否有一种方法可以在xyz坐标系中定义变量r =(1,1,1),然后定义一个新变量/集合S = {all s:distance(r,s)< = radius )}。如果我能这样做,这将非常方便,但我不确定MATLAB如何处理类似的问题,因为它涉及无穷多的点,所以MATLAB必须有一些定义的最大分辨率。这可能吗?能够以这种方式定义3D结构将是非常好的。谢谢

回答

0

您可以使用如下代码:

r=1; 
resolutionPhi=50; 
resolutionTheta=60; 
phi=linspace(0,pi,resolutionPhi); %linspace gives (50) equally spaced points between (0) and (pi) 
theta=linspace(0,2*pi,resolutionTheta); 
[phi,theta]=meshgrid(phi,theta); %meshgrid replicates the vectors into a rectangular array 

x=r*sin(phi).*cos(theta); 
y=r*sin(phi).*sin(theta); 
z=r*cos(phi); 

您可以通过更改分辨率变量调整分辨率。

+0

谢谢,这是非常有用的 – Franz

2

如果

所有s:距离(r,S)< =半径)

您的意思是

所有R中š:距离(r,s)< =半径)

那么答案是:

即,该规则可以使用anonymous function如下构建:

>> r = [1 1 1]; %// set center 
>> radius = 2; %// set radius 
>> inS = @(s) sqrt(sum((s-r).^2))<radius; 

功能inS返回true1)当且仅当其输入属于小号,并false0)否则。例如,

>> inS([0 0 0]) 
ans = 
    1 
>> inS([3 4 5]) 
ans = 
    0 
>> inS([pi sqrt(2) exp(-1)]) 
ans = 
    0 

这可能是最接近你可以“定义”的设置。

如果你想一次测试,而不是使用一个循环,可以vectorize the functionbsxfun几个值,:

>> inS = @(s) sqrt(sum((bsxfun(@minus, s, r)).^2, 2))<radius; 
>> points = [ 0 0 0 
       3 4 5 
       pi sqrt(2) exp(-1) ]; 
>> inS(points) 
ans = 
    1 
    0 
    0 
+0

谢谢!很好的例子,这正是我的意思。我认为你可以编写一个循环,它可以像任意分辨率的网格一样在所有三维坐标中运行,并按照你说 – Franz

+0

的方式分配值来近似3D对象的形状。可以,你可以使用循环。但是最好是对函数进行矢量化,以便一次获取所有值。见编辑 –

+0

很好的答案!但我认为它被称为“无数无限的元素”。 –

相关问题