也许没有直接的方法来指定由viscircles
返回的对象的z
位置,但通常情况下后续可以修改任何图形对象的属性和位置(大部分时间都是这样)。
方法一:创建后修改圆形。
如果您计划对图形对象进行修改,首先要做的事情是检索其句柄
。因此,在您的情况下,您需要通过指定返回值(其中包含您想要的句柄
)来调用viscircles
:
hg = viscircles(circle_pos, circle_rad);
我没有安装 Image Processing Toolbox
,因此无法访问 viscircles
函数。但是从文档中我了解到返回的句柄是一个 hggroup
。一个 hggroup
只是一个容器,包含一个或多个更原始图形对象的句柄。在这种情况下,hggroup
包含 4 个 lines
的句柄(即 4 个圆)。
将 hggroup
中的所有对象转换为最简单的方法是使用 hgtransform
对象。我们将定义一个 Translation 转换,然后 hgtransform
将应用它到 4 个圆上(即 hggroup
的所有子元素)。
要定义转换,我们将使用 makehgtform
对象。
我们开始吧:
ht = hgtransform ;
set(hg,'Parent',ht) ;
zc = max(max(Z)) ;
Tz = makehgtform('translate',[0 0 zc]) ;
set(ht,'Matrix',Tz)
完成了,你的四个圆现在应该在表面上方。请注意,您可以为zc
指定任何其他值(不仅仅是表面的最大值)。
方法二:自己动手
如果您不想依赖图像处理工具箱,或者根本没有它,那么自己在三维空间中创建圆相对容易。
这里有一个函数,它将以与viscircles
相似的方式创建圆,但它还允许您为圆心位置指定可选的z
坐标。
circles_3D.m
代码:
function hg = circles_3d( pos , rad , varargin )
ax = gca ;
holdState = get(ax,'NextPlot') ;
set(ax,'NextPlot','add') ;
tt = linspace(0,2*pi) ;
hg = hggroup(ax) ;
for k = 1:numel(rad)
c = pos(k,:) ;
r = rad(k) ;
x = c(1) + r.*cos(tt) ;
y = c(2) + r.*sin(tt) ;
z = zeros(size(x)) ;
if numel(c)==3 ; z = z + c(3) ; end
plot3(hg,x,y,z,varargin{:}) ;
end
set(ax,'NextPlot',holdState) ;
现在您可以调用此函数而不是viscircles
。我使用了varargin
参数将任何line
属性传递给创建的圆(因此您可以指定Color
,LineWidth
和任何其他常见参数)。
为了举例说明,我需要重新创建一个类似于您的表面,其中有4个“零”极点分布在最大值周围:
pc = 0.5 ;
pw = 0.05 ;
[X,Y] = meshgrid(-5:.1:5);
R = sqrt(X.^2 + Y.^2) + eps ;
Z = sin(R)./R;
[idxPoles] = find(abs(X)>=pc-pw & abs(X)<=pc+pw & abs(Y)>=pc-pw & abs(Y)<=pc+pw ) ;
Z(idxPoles)= 0 ;
hs = surf(X,Y,Z) ; shading interp
这将产生:
现在,您可以使用circles_3D
函数轻松获取您的圆:
zc = max(max(Z)) ;
circle_pos = [ pc pc zc ; -pc -pc zc ; -pc +pc zc ; +pc -pc zc ] ;
circle_rad = 0.2 * ones(4,1);
h = circles_3d( circle_pos , circle_rad , 'Color','r','LineWidth',2) ;
获取并返回:
请注意,我编写了这个函数,它还返回一个包含您的线条(圆)的
hggroup
对象。因此,如果您想稍后
移动它们,请应用与答案第一部分相同的技巧。
R^2 to R
函数和表面的定义(和代码)... - Hoki[X, Y] = meshgrid(linspace(-10, 10, 500)); surf(X, Y, X.^2 + Y.^2)
- Anti Earth