在MATLAB中对球体表面的子集进行着色

Shade a subset of a sphere's surface in MATLAB

我正试图生成一个半球图,该半球图的表面上有一个阴影区域,该区域受仰角和方位角的最大/最小值限制。本质上,我正在尝试重现此内容:

> </p>
<p>生成半球很容易,但是过去让我很受挫。有什么想法吗?</p>
<p>这是我用来生成该球体的代码:</p>
<div class=

1
2
3
4
5
6
7
[x,y,z] = sphere;
x = x(11:end,:);
y = y(11:end,:);
z = z(11:end,:);
r = 90;
surf(r.*x,r.*y,r.*z,'FaceColor','yellow','FaceAlpha',0.5);
axis equal;


如果要突出显示半球的某个区域,请首先确定最小和最大方位角(水平扫描)和仰角(垂直扫描)angular。完成此操作后,获取您的x,y,z坐标并将其转换为球坐标中的相应angular。完成此操作后,您可以根据这些angular将x,y,z坐标子集化。要将笛卡尔坐标转换为球形,可以这样做:

> </p>
<p> <img src=

theta是您的海拔,而phi是您的方位。 r将是球体的半径。因为sphere为单位球体生成坐标,所以r = 1。因此,要计算angular,我们只需要执行以下操作:

1
2
theta = acosd(z);
phi = atan2d(y, x);

请注意,仰角/ theta限制在0到180度之间,而方位角/ phi限制在-180到180度之间。由于您仅创建球体的一半,因此高程应仅在0到90度之间变化。另请注意,acosdatan2d以度为单位返回结果。现在我们在这里,您只需要对要绘制的球体的哪一部分进行子集化。例如,假设我们要限制球面,以使最小值最小。和最大方位角跨度为-90至90度,而仰角仅跨度为0至45度。这样,让我们??找到满足这些约束的x,y,z坐标,并确保将超出此范围的任何值设置为NaN,以使这些点不会在球体上绘制。因此:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
%// Change your ranges here
minAzimuth = -90;
maxAzimuth = 90;
minElevation = 0;
maxElevation = 45;

%// Compute angles - assuming that you have already run the code for sphere
%// [x,y,z] = sphere;
%// x = x(11:end,:);
%// y = y(11:end,:);
%// z = z(11:end,:);
theta = acosd(z);
phi = atan2d(y, x);

%%%%%// Begin highlighting logic
ind = (phi >= minAzimuth & phi <= maxAzimuth) & ...
      (theta >= minElevation & theta <= maxElevation); % // Find those indices
x2 = x; y2 = y; z2 = z; %// Make a copy of the sphere co-ordinates
x2(~ind) = NaN; y2(~ind) = NaN; z2(~ind) = NaN; %// Set those out of bounds to NaN

%%%%%// Draw our original sphere and then the region we want on top
r = 90;
surf(r.*x,r.*y,r.*z,'FaceColor','white','FaceAlpha',0.5); %// Base sphere
hold on;
surf(r.*x2,r.*y2,r.*z2,'FaceColor','red'); %// Highlighted portion
axis equal;
view(40,40); %// Adjust viewing angle for better view

...这就是我得到的:

enter


一个选项是创建一个数组,该数组具有要分配给每个点的相应颜色。

一个最小的示例(使用三角函数将方位角和仰角转换为x,y和z上的逻辑条件):

1
2
3
c=(y>0).*(x>0).*(z>0.1).*(z<0.5);
c(c==0)=NaN;
surf(r.*x,r.*y,r.*z,c ,'FaceAlpha',0.5); axis equal;

产生此结果:

ex.

注意:这仅适用于网格的分辨率。 (即表面的每个"补丁"可以具有不同的颜色)。为了精确地重绘您的绘图,您可能希望将网格球与另一个网格球叠加,该球体上的网格点数量很多,您可以在上面应用上面的代码。