一,曲面
三维曲面是指在三维空间中定义的曲面,其通常用数学方程来描述。三维曲面的例子包括平面、球面、圆柱面、锥面等。它们可以通过参数方程或隐式方程进行定义。
常见的三维曲面类型
-
平面:
- 形式:(
)
- 例子:(
)
- 形式:(
-
球面:
- 形式:(
)
- 例子:以原点为中心的单位球面:(
)
- 形式:(
-
圆柱面:
- 形式:(
)
- 例子:直立的圆柱面:(
)
- 形式:(
-
锥面 - 形式:(
)
- 例子:直立的圆锥面:(
)
- 例子:直立的圆锥面:(
. 抛物面:
- 形式:(
)
- 例子:(
)
- 双曲面:
- 形式:(
)
- 例子:单叶双曲面。
- 形式:(
应用领域
三维曲面在很多领域都有广泛的应用,包括:
- 计算机图形学:用于建模和渲染三维物体。
- 工程:用于设计和分析的几何形状。
- 数学:用于研究几何性质和拓扑特性。
1.Surface
函数用于创建一个三维表面对象
Surface
函数用于创建一个三维表面对象,通常是在动画或可视化库中使用,比如 Manim(一个用于创作数学动画的库)。
Surface(func, u_range=[0, 1], v_range=[0, 1], resolution=32, surface_piece_config={},
fill_color=ManimColor('#29ABCA'), fill_opacity=1.0, checkerboard_colors=
[ManimColor('#29ABCA'), ManimColor('#236B8E')], stroke_color=ManimColor('#BBBBBB'),
stroke_width=0.5, should_make_jagged=False, pre_function_handle_to_anchor_scale_factor=1e-
05, **kwargs)
这个函数的参数设置了表面的各种属性,包括形状、颜色、填充方式等。
以下是对各个参数的解释:
-
func: 这是一个函数,用于定义表面的形状。该函数通常是一个有两个参数(u和v)的函数,这些参数将对应于表面的每个点的坐标。
-
u_range: 这是一个包含两个值的列表,定义了u参数的范围。默认值为[0, 1]。
-
v_range: 这是一个包含两个值的列表,定义了v参数的范围。默认值为[0, 1]。
-
resolution: 这个整数值定义了表面的细分程度,决定了在每个方向上的点的数量,默认值为32。
-
surface_piece_config: 一个字典,允许设置表面拼片的额外配置选项,例如是否平滑或是否渲染为多块。
-
fill_color: 表面填充颜色,使用 ManimColor 对象表示,默认值为('#29ABCA')。
-
fill_opacity: 表面填充的透明度,范围是0到1,默认值为1.0(完全不透明)。
-
checkerboard_colors: 用来定义棋盘格纹理的颜色,通常是一个包含两种颜色的列表,默认值为['#29ABCA', '#236B8E']。
-
stroke_color: 表面的边框颜色,默认值为('#BBBBBB')。
-
stroke_width: 表面边框的宽度,默认值为0.5。
-
should_make_jagged: 一个布尔值,指示是否使边缘呈锯齿状,默认值为False。
-
pre_function_handle_to_anchor_scale_factor: 一个浮点数,用于在调用函数之前缩放锚点的比例因子,默认值为1e-05。
-
kwargs: 其他额外的关键字参数,可以根据需要传递。
下面是一个使用所有参数的示例代码,其中包含相关注释:
from manim import *
class ParaSurface01(ThreeDScene):
def func(self, u, v):
return np.array([ u, v, np.sin(u * np.pi) * np.cos(v * np.pi) ]) # 使用 u 和 v 来生成 z 轴的值
def construct(self):
axes = ThreeDAxes(x_range=[-4,4], x_length=8)
surface = Surface(
lambda u, v: axes.c2p(*self.func(u, v)),
u_range=[0, 2], # u参数范围从0到2
v_range=[0, 1], # v参数范围从0到1
resolution=32, # 表面细分的分辨率
surface_piece_config={}, # 表面拼片配置
fill_color=ManimColor('#29ABCA'), # 填充颜色为青色
fill_opacity=0.8, # 填充透明度为0.8
checkerboard_colors=[ManimColor('#29ABCA'), ManimColor('#236B8E')], # 棋盘格颜色
stroke_color=ManimColor('#BBBBBB'), # 边框颜色为灰色
stroke_width=1.0, # 边框宽度为1.0
should_make_jagged=False, # 不使用锯齿边缘
pre_function_handle_to_anchor_scale_factor=1e-05, # 缩放比例因子
)
self.set_camera_orientation(theta=115 * DEGREES, phi=75 * DEGREES)
self.add(axes, surface)
示例2:
from manim import *
class ParaSurface(ThreeDScene):
def func(self, u, v):
return np.array([np.cos(u) * np.cos(v), np.cos(u) * np.sin(v), u])
def construct(self):
axes = ThreeDAxes(x_range=[-4,4], x_length=8)
surface = Surface(
lambda u, v: axes.c2p(*self.func(u, v)),
u_range=[-PI, PI],
v_range=[0, TAU],
resolution=8,
)
self.set_camera_orientation(theta=70 * DEGREES, phi=75 * DEGREES)
self.add(axes, surface)
图形的填充颜色函数
这两个函数 set_fill_by_checkerboard
和 set_fill_by_value
通常用于在数据可视化中设置图形的填充颜色。虽然确切的上下文取决于所使用的库(例如 Plotly、Matplotlib 等),但在这里我为您解释它们可能的含义和参数。
1.set_fill_by_checkerboard
set_fill_by_checkerboard(*colors, opacity=None)
set_fill_by_checkerboard(*colors, opacity=None)的作用是通过一种类似棋盘的方式来填充颜色。以下是参数的解释:
*colors
: 变量数量不定的颜色值,可以是字符串(颜色名称)或十六进制颜色代码(如"#FF0000"
)。这些颜色将用于填充图形的不同部分。opacity
: 一个可选的浮点值,范围通常是 0 到 1,表示填充颜色的透明度,0 表示完全透明,1 表示完全不透明。-
示例代码:
class FillByValueExample(ThreeDScene): def construct(self): resolution_fa = 8 self.set_camera_orientation(phi=75 * DEGREES, theta=-160 * DEGREES) axes = ThreeDAxes(x_range=(-5, 5, 1), y_range=(-5, 5, 1), z_range=(-1, 1, 0.5)) def param_surface(u, v): x = u y = v z = np.sin(x) * np.cos(y)*0.25 return z surface_plane = Surface( lambda u, v: axes.c2p(u, v, param_surface(u, v)), resolution=(resolution_fa, resolution_fa), v_range=[-2.55, 2.5], u_range=[-1.5, 1.5], ) surface_plane.set_style(fill_opacity=1) surface_plane.set_fill_by_checkerboard(RED, opacity=0.55) #surface_plane.set_fill_by_value(axes=axes, colorscale=[(RED, -0.5), (YELLOW, 0), (GREEN, 0.5)], axis=2) self.add(axes, surface_plane)
2.set_fill_by_value
set_fill_by_value(axes, colorscale=None, axis=2, **kwargs)
set_fill_by_value(axes, colorscale=None, axis=2, **kwargs)
的作用是根据给定的值来设置填充颜色。以下是参数的解释:
axes
: 需要填充的图形的坐标轴对象。colorscale
: 定义颜色渐变的列表或数组,通常是与数据值对应的颜色映射,类似于热图颜色渐变,可以是预定义的(比如Viridis
、Plasma
等)或自定义的。axis
: 指定使用的轴,通常为整数 0、1 或 2,表示 x 轴、y 轴或 z 轴。**kwargs
: 其他关键字参数,可能用于进一步定制填充的行为(例如设置颜色范围、边界等)。
示例代码
下面是一个使用 set_fill_by_value
的示例代码,假设这是在一个绘图库(如 Matplotlib 或 Plotly)中填充的一个简单示例:
class FillByValueExample12(ThreeDScene):
def construct(self):
resolution_fa = 8
self.set_camera_orientation(phi=75 * DEGREES, theta=-160 * DEGREES)
axes = ThreeDAxes(x_range=(0, 5, 1), y_range=(0, 5, 1), z_range=(-1, 1, 0.5))
def param_surface(u, v):
x = u
y = v
z = np.sin(x) * np.cos(y)
return z
surface_plane = Surface(
lambda u, v: axes.c2p(u, v, param_surface(u, v)),
resolution=(resolution_fa, resolution_fa),
v_range=[0, 5],
u_range=[0, 5],
)
surface_plane.set_style(fill_opacity=1)
surface_plane.set_fill_by_value(axes=axes, colorscale=[(RED, 0.5), (YELLOW, 1), (GREEN, 5)], axis=1)
self.add(axes, surface_plane)
2.圆环(Torus
)
Torus
是一个在 3D 图形和几何建模中常用的函数,用于生成一个二维参数化的环面(圆环)。这个环面是由两个半径定义的,分别是主要半径和次要半径。
参数解释
-
major_radius: 这是环面中心到管道中心的距离,定义了环的“厚度”。例如,
major_radius=3
表示环面中心到管道中心的距离为 3 个单位。 -
minor_radius: 这是环面管道的半径,定义了环的“大小”。例如,
minor_radius=1
表示管道的半径为 1 个单位。 -
u_range: 这是参数
u
的范围,通常定义为一个元组 (起始值, 终止值)。例如,u_range=(0, 2π)
表示u
在 0 到 2π 之间变化,这是一个完整的循环。 -
v_range: 这是参数
v
的范围,类似于u_range
,通常也定义为一个元组 (起始值, 终止值)。例如,v_range=(0, 2π)
。 -
resolution: 可选参数,定义网格的分辨率。如果设置,可能会影响生成的环面细节程度。
-
kwargs: 其他关键字参数,用于进一步自定义环面属性,比如颜色、光照等。
示例代码1:
class ExampleTorus(ThreeDScene):
def construct(self):
axes = ThreeDAxes()
torus = Torus(major_radius=4,minor_radius=0.5,u_range=(0, PI),v_range=(0,PI),resolution=108)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.add(axes, torus)
示例2:
class ExampleTorus(ThreeDScene):
def construct(self):
axes = ThreeDAxes()
torus = Torus(major_radius=4,minor_radius=2,u_range=(0, -PI),v_range=(0,2*PI),resolution=108)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.add(axes, torus)
示例3:
class ExampleTorus13(ThreeDScene):
def construct(self):
axes = ThreeDAxes()
torus = Torus(major_radius=4,minor_radius=2,u_range=(0, -PI*14/13),v_range=(0,2*PI),resolution=100)
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.add(axes, torus)
示例4:
class ExampleTorus24(ThreeDScene):
def construct(self):
axes = ThreeDAxes()
torus = Torus( )
self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES)
self.add(axes, torus)