接上次的【Manim】用manim描述二次曲面——上-优快云博客内容,接下来继续绘制并解释二次曲面。
双曲面
这是双曲面的一般方程。
这是一个典型的两片双曲面的草图。
前面带正数的变量将给出图形居中的轴。注意,单张纸的双曲面和两张纸的双曲面的唯一区别是变量前面的符号。它们是完全相反的符号。同样要注意的是,就像我们处理锥体一样,如果我们解出z的方程正的部分会给出上半部分的方程而负的部分会给出下半部分的方程。
接下来用manim实现该双曲面的绘制:
示例代码:
from manim import *
class HyperboloidofOneSheetScene03(ThreeDScene):
def construct(self):
# 设置相机背景颜色为白色
self.camera.background_color = WHITE
# 设置参数
a, b, c = 0.3, 0.4, 0.6 # 半轴长度
# 创建超曲面,表示上半部分
hyperboloid = Surface(
lambda u, v: np.array([
a * np.sinh(v) * np.cos(u), # x = a * sinh(v) * cos(u)
b * np.sinh(v) * np.sin(u), # y = b * sinh(v) * sin(u)
c * np.cosh(v) # z = c * cosh(v)
]),
u_range=[0, TAU], # u 从 0 到 2π
v_range=[-2, 2], # v 范围更新为 -2 到 2,显示上半部分超曲面
resolution=(50, 50) # 网格分辨率
)
# 设置超曲面的样式
hyperboloid.set_style(fill_color=(RED, PURPLE), fill_opacity=1, stroke_color=BLUE_E)
# 创建超曲面,表示下半部分
hyperboloid2 = Surface(
lambda u, v: np.array([
a * np.sinh(v) * np.cos(u), # x = a * sinh(v) * cos(u)
b * np.sinh(v) * np.sin(u), # y = b * sinh(v) * sin(u)
-c * np.cosh(v) # z = -c * cosh(v),这里是下半部分
]),
u_range=[0, TAU], # u 从 0 到 2π
v_range=[-2, 2], # v 范围更新为 -2 到 2,显示下半部分超曲面
resolution=(50, 50) # 网格分辨率
)
# 设置下半部分超曲面的样式
hyperboloid2.set_style(fill_color=(RED, PURPLE), fill_opacity=1, stroke_color=BLUE_E)
# 在超曲面上绘制平行线
for v in np.linspace(-1, 2, 2): # 在超曲面上绘制平行线
line = Line(
start=np.array([a * np.sinh(-2) * np.cos(0), b * np.sinh(-2) * np.sin(0), c * np.cosh(-2)]),
end=np.a