Plotly (Python)로 대화식으로 매듭을 그립니다.

Plotly (Python)로 대화식으로 매듭을 그립니다.



1. 소개



이번에는 매듭(knot)을 Plotly로 3차원 공간상에 도시하고자 합니다. 학습의 보조가 되면 다행입니다.

↓와 같은 것이 가능합니다.

See the Pen dyoyxKW by Sota Misawa ( @mitawaut )
on CodePen .

소스(GitHub)



2. 복습



매듭을 보여줄 때 필요한 최소한의 복습을 해 둡니다.



매듭(knot)이란 $S^3$ 에 구분 선형적으로 포함된 $S^1$ 를 가리킵니다. $S^3$ 는 $\mathbb{R}^3\cup\{\infty\}$ 로 간주했기 때문에, 포함된 $S^1$ 가 $\infty$ 를 포함하지 않으면 $\mathbb{ R}^3$ 에 포함된 $S^1$ 라고 생각할 수 있습니다.



매듭의 유명한 표현 방법으로서 2차원 토러스면 $\mathbb{T}^2$ 에 따른 매듭이라는 것이 생각됩니다. 토러스로서 다음의 사상이 정하는 폐곡면을 생각합니다:

$$\mathbb{T}^2 : [-\pi ,\pi]^2\ni (\phi,\\theta)\longmapsto\bigl(\cos\phi\(3+\cos\theta),\\sin\phi\(3+\cos\theta),\-\sin\theta\bigr)\in\mathbb{R}^3$$





$\mathbb{T}^2$ 위의 닫힌 곡선에서 두 개의 정수 세트 $(n,\m)$ 를 사용하여 ( $\mathbb{T}^2$ 의 정의 영역을 적절히 확장합니다. ),

$$

T(n,\m) : [-\pi ,\pi]\ni t\longmapsto\mathbb{T}^2(nt,\mt)\in\mathbb{R}^3$$



로 표시되는 것을 생각합니다. 이것은 매듭으로 생각할 수 있습니다. 이와 관련하여 다음 정리가 알려져 있습니다.



정리. $\mathbb{T}^2$ 에 포함되는 임의의 명확하지 않은 매듭 $K$ 에 대해서, 서로 소의 정수의 쌍 $(n,\m)$ 가 존재해 $K$ 는 $T(n,\m)$와 같은 값이다.



이 정리에서, 매듭의 표현으로서 $T(n,\m)$ 를 나타내자고 하는 것입니다. 다음은 $T(2,\3)$ 의 그림을 보여줍니다.



3. 구현



여기에서 5분 요리의 시작입니다. ipywidgets를 사용하기 때문에 jupyter notebook 추천입니다.




requirements.txt[발췌]

ipython==7.12.0
numpy==1.18.1
plotly==4.4.1



ipywidgets에서 $n,\m$ 을 조작할 수 있도록 하는 것을 목표로 합니다. 먼저 필요한 것을 가져옵니다.




# import modules
import plotly.offline as offline
import plotly.graph_objs as go
import numpy as np
from ipywidgets import interactive, VBox, widgets
from IPython.display import display

offline.init_notebook_mode(connected=True)


다음에 $\mathbb{T}^2$ 와 $T(n,\m)$ 도 정의합니다. 이것도 위의 논의를 그대로 구현할 뿐입니다.



# functions
def torus(p, t):
    x = np.cos(p) * (3 + np.cos(t))
    y = np.sin(p) * (3 + np.cos(t))
    z = -np.sin(t)
    return (x, y, z)

def knot(n, m):
    theta = np.linspace(-np.pi, np.pi, 1000)
    p, t = n*theta, m*theta
    return torus(p, t)


다음에 plot하면 됩니다. 초기값을 $(m,\m) = (2,\3)$ 로 하고, 슬라이드 바의 범위는 $n$ : -10~10, $m$ : 0~10 으로 했습니다.



fig = go.FigureWidget()
scatt = fig.add_scatter3d()

def update(n=2, m=3):
    with fig.batch_update():
        (cx, cy, cz) = knot(n, m)
        scatt.data[0].x=cx
        scatt.data[0].y=cy
        scatt.data[0].z=cz
        scatt.data[0].mode='lines'
        scatt.data[0].line=dict(
                    width=10,
                    color='green')

vb = VBox((fig, interactive(update, n=(-10, 11, 1), m=(0, 10, 1))))
display(vb)


다음과 같이 표시되어 슬라이드바를 만지면 동시에 매듭이 바뀌면 성공입니다.



4. 마지막으로



보이지 않는 사람이 있으면 ipython 주위의 버전을 확인합시다. 첫 번째 게시물이 몇 분 정도 좋았기 때문에 위험하다고 생각했기 때문에 복습이라는 여분의 섹션을 만들었습니다


좋은 웹페이지 즐겨찾기