學(xué)可視化:原理與實(shí)現(xiàn))
import numpy as np self.play( Create(cut_edge_line : Line( startnp.array([-2, -0.5, -1]) DOWN * 0.3, endnp.array([-2, 0.5, -1]) DOWN * 0.3, colorYELLOW, stroke_width2, )), Write(cut_label), run_time1.5, ) self.wait(1) # 旋轉(zhuǎn)展示 self.begin_ambient_camera_rotation(rate0.3) self.wait(2) # 8. 自動演示拓?fù)渥儞Q簡化的動畫 # 創(chuàng)建一個小球體代表空間點(diǎn) point Sphere(radius0.1).set_color(RED) point.move_to(klein_bottle_func(0, 0)) self.play(FadeIn(point)) # 讓點(diǎn)沿著瓶面移動 self.play( UpdateFromAlphaFunc( point, lambda m, a: m.move_to(klein_bottle_func(2 * np.pi * a, 0)) ), run_time3, ) # 9. 循環(huán)展示 self.play( FadeOut(cut_edge_line), FadeOut(cut_label), FadeOut(point), *[strip.animate.set_opacity(0.8) for strip in strips], run_time2, ) # 展示最終結(jié)構(gòu) self.play( Rotate(strips, angle2 * np.pi, axisUP), run_time4, rate_funcrate_funcs.smooth, ) self.begin_ambient_camera_rotation(rate0.2) self.wait(3) # 停止旋轉(zhuǎn)并等待 self.stop_ambient_camera_rotation() self.wait(1) # 淡出所有元素 self.play( *[FadeOut(mobj) for mobj in self.mobjects if mobj not in [title]], title.animate.set_opacity(0), run_time2, ) self.play(FadeOut(axes)) # dont remove below command for run button to work %manim -qm -v WARNING KleinBottleScene一、克萊因瓶的數(shù)學(xué)模型1.1 克萊因瓶的拓?fù)涠x克萊因瓶Klein Bottle是德國數(shù)學(xué)家菲利克斯·克萊因Felix Klein于1882年提出的單側(cè)閉曲面它是最基本的不可定向曲面之一。拓?fù)鋵W(xué)定義克萊因瓶是由一個圓柱體經(jīng)過以下操作構(gòu)造而成將圓柱體的一端扭轉(zhuǎn)180°后與另一端粘合或者等價地將莫比烏斯帶的邊界與一個圓盤粘合核心性質(zhì)克萊因瓶內(nèi)部與外部連通沒有明確的內(nèi)外之分不可定向性。1.2 參數(shù)方程克萊因瓶在三維空間中的標(biāo)準(zhǔn)參數(shù)方程為其中u \in [0, 2\pi)\)繞瓶體一周的角度r 0\)瓶身主半徑本代碼取 \(r2\)該方程對應(yīng)的幾何結(jié)構(gòu)可分解為三個階段莫比烏斯帶階段當(dāng) v∈[0,2π] 時形成莫比烏斯帶的局部幾何邊界扭轉(zhuǎn)階段當(dāng) v∈[2π,3π] 時曲面邊界發(fā)生半扭轉(zhuǎn)閉合階段當(dāng) v∈[3π,4π]時曲面邊界閉合形成自交的封閉結(jié)構(gòu)二、代碼實(shí)現(xiàn)的數(shù)學(xué)原理2.1 參數(shù)化函數(shù)設(shè)計def klein_bottle_func(u, v): 克萊因瓶參數(shù)方程 x (r np.cos(u/2)*np.sin(v) - np.sin(u/2)*np.sin(2*v)) * np.cos(u) y (r np.cos(u/2)*np.sin(v) - np.sin(u/2)*np.sin(2*v)) * np.sin(u) z np.sin(u/2)*np.sin(v) np.cos(u/2)*np.sin(2*v) return np.array([x, y, z]) UP*0.5數(shù)學(xué)分析系數(shù) rcos?(u/2)sin?v?sin?(u/2)sin?2vrcos(u/2)sinv?sin(u/2)sin2v 決定了瓶體的徑向距離\cos(u/2)\) 和 \(\sin(u/2)\) 項產(chǎn)生半頻率調(diào)制這正是莫比烏斯帶扭轉(zhuǎn)特性的體現(xiàn)2.2 參數(shù)域劃分參數(shù)數(shù)學(xué)符號范圍物理意義u圓周角[0,2π]繞瓶體軸線旋轉(zhuǎn)v母線參數(shù)[0,4π]形成雙層結(jié)構(gòu)采樣策略代碼將 vv-范圍 [0,4π]劃分為7段每段寬為?用于創(chuàng)建7種不同顏色的色帶增強(qiáng)拓?fù)浣Y(jié)構(gòu)的可視化效果。三、代碼模塊功能詳解3.1 場景配置模塊class KleinBottleScene(ThreeDScene): def construct(self): self.camera.background_color BLACKBOARD_GREEN self.set_camera_orientation(phi70°, theta-35°, zoom0.85)參數(shù)作用background_color設(shè)置場景背景色黑綠色模擬物理黑板phi70°相機(jī)俯仰角相對于水平面的角度theta-35°相機(jī)水平旋轉(zhuǎn)角逆時針為負(fù)zoom0.85相機(jī)縮放系數(shù)0.85倍3.2 二維界面固定模塊self.add_fixed_in_frame_mobjects(title, group1, group2, group3)該調(diào)用將四個信息組固定在屏幕坐標(biāo)系上不受三維相機(jī)旋轉(zhuǎn)的影響確保文字始終面向觀眾。3.3 三維坐標(biāo)軸創(chuàng)建模塊axes ThreeDAxes( x_range[-4, 4, 1], # x從-4到4刻度間隔1 y_range[-4, 4, 1], # y從-4到4刻度間隔1 z_range[-3, 3, 1], # z從-3到3刻度間隔1 x_length7, # 顯示長度7單位 y_length7, z_length5, )顏色漸變設(shè)置for axis in [axes.x_axis, axes.y_axis, axes.z_axis]: axis.set_color(color[RED, WHITE, RED])每條軸使用紅-白-紅漸變著色漸變色數(shù)組在Manim中自動插值3.4 文本與公式生成模塊對象類型使用函數(shù)特點(diǎn)應(yīng)用場景Text()純文本無數(shù)學(xué)公式支持標(biāo)題、標(biāo)簽MathTex()LaTeX公式數(shù)學(xué)渲染參數(shù)方程eq1MarkupText()富文本支持\n換行性質(zhì)清單eq2, eq3示例說明eq1 MathTex( rx \cos u \left( r \cos\frac{u}{2} ... \right)\\, # 第一行 ry \sin u ...\\, # 第二行 rz ..., # 第三行 )MathTex中\(zhòng)\表示換行保持等距排列\(zhòng)\left(...\\right)實(shí)現(xiàn)自適應(yīng)用括號3.5 表面構(gòu)建模塊Simulated 表面構(gòu)建代碼如下原代碼未顯示完整但基于Manim慣例surface Surface( lambda u, v: klein_bottle_func(u, v), # 參數(shù)方程 u_range[0, 2*PI], # u參數(shù)范圍 v_range[v_min, v_max], # v參數(shù)范圍分段 resolution(32, 16), # 網(wǎng)格分辨率 fill_opacity0.7, # 表面不透明度 stroke_width0.1, # 網(wǎng)格線寬度 fill_colorcolor, # 表面填充色 )核心參數(shù)解析參數(shù)含義作用resolution(32,16)在u方向32個采樣點(diǎn)v方向16個采樣點(diǎn)控制網(wǎng)格細(xì)密度fill_opacity0.7表面填充不透明度為0.7使表面半透明可見內(nèi)部結(jié)構(gòu)stroke_width0.1網(wǎng)格線條寬顯示線框架構(gòu)fill_color單色填充7種顏色之一3.6 動畫創(chuàng)建模塊推斷動畫序列# 1. 創(chuàng)建坐標(biāo)軸 self.play(Create(axes), run_time0.5) # 2. 逐條顯示色帶 for strip in strips: self.play(Create(strip), run_time0.3) # 3. 相機(jī)旋轉(zhuǎn) self.begin_ambient_camera_rotation(raterate_funcs.linear) self.wait(3)Create(): 顯示對象的輪廓并逐步填充begin_ambient_camera_rotation(): 自動旋轉(zhuǎn)相機(jī)速率函數(shù)為線性(恒定速度)四、關(guān)鍵數(shù)學(xué)算法解釋4.1 莫比烏斯帶的推廣克萊因瓶本質(zhì)上可看作兩個莫比烏斯帶的邊界粘合的產(chǎn)物。代碼中的參數(shù)包含基礎(chǔ)環(huán)部分(r調(diào)幅)?(cos?u,sin?u)形成主環(huán)半頻率調(diào)制cos?(u/2)和 sin?(u/2)使母線扭轉(zhuǎn)180°這是莫比烏斯帶的特征雙重周期在v方向使用[0,4π]使得表面本身閉合需轉(zhuǎn)兩圈才回到起始位置4.2 自交結(jié)構(gòu)當(dāng) u0 且 v2π時zz分量首先對 sin? 項使表面自身穿透形成所謂的“瓶頸”自交區(qū)域。在數(shù)學(xué)上r2 的選擇避免了參數(shù)等價點(diǎn)造成的退化。五、代碼優(yōu)缺點(diǎn)分析優(yōu)點(diǎn)模塊化設(shè)計將2D文本與3D幾何拓?fù)浞蛛x使用add_fixed_in_frame解耦彩色分區(qū)七種顏色清晰展示拓?fù)浣Y(jié)構(gòu)漸變色坐標(biāo)軸視覺美觀且直觀待改進(jìn)處未完成代碼原代碼在strips創(chuàng)建循環(huán)后未完整顯示缺少Surface構(gòu)建部分缺少動畫self.play(...)序列未展示完整無交互控制未提供用戶輸入?yún)?shù)調(diào)整六、結(jié)語本文通過數(shù)學(xué)方程與Manim可視化實(shí)現(xiàn)了克萊因瓶的三維展示核心在于將拓?fù)鋵W(xué)定義轉(zhuǎn)化為精確的參數(shù)化方程并利用Manim強(qiáng)大的3D表面渲染能力呈現(xiàn)了該不可定向曲面的奇異特征。該代碼既是數(shù)學(xué)教學(xué)的直觀工具也是三維視化技術(shù)的典型應(yīng)用案