1. はじめに
あまり聞き慣れない「超二次関数」ですが、少ないパラメータで様々な3次元形状を表現できるそうです1。
パラメータが変わればどんな形状になるのか確認したくなり、Web アプリを作成したので紹介します。
2. 超二次関数
2.1. 定義式
複数の変形式を確認していますが、今回は、以下の定義式を用います。
$$
\left(\left|\frac{x}{a}\right|^{n_2} + \left|\frac{y}{b}\right|^{n_2}\right)^\frac{n_1}{n_2} + \left|\frac{z}{c}\right|^{n_1} = 1
$$
ここで、$n_1$ と $n_2$ は形状を変化させるパラメータ、 $a$, $b$, および $c$ は大きさをあらわすパラメータとなります。
2.2. 3次元形状の例
超二次関数で表現された3次元形状の例を示します。
3. 3Dモデルによる可視化
streamlit
で Web アプリを作成し、share.streamlit.io でデプロイしました。
具体的には下のような Web アプリで、左側のサイドバーにあるピンク色のスライダーでパラメータを調整すると、右側の3Dモデルが変化します。
4. python code
ここでは、コードの主要部分を抽出して紹介します。
import streamlit as st
import plotly.graph_objects as go
import numpy as np
st.title('Superquadrics')
@st.cache
def superquadrics(a,b,c,n1,n2,x,y,z):
values = np.power(np.power(np.abs(x/a),n2) \
+ np.power(np.abs(y/b),n2),n1/n2) \
+ np.power(np.abs(z/c),n1)
return values
st.sidebar.subheader('Parameters')
a = 1.
b = 1.
c = st.sidebar.slider('c (a=b=1)', .2, 2., 1., .2)
n1 = st.sidebar.slider('n1', 1, 10, 10, 1)
n2 = st.sidebar.slider('n2', 1, 10, 2, 1)
X, Y, Z = np.mgrid[-1:1:20j, -1:1:20j, -2:2:40j]
fig = go.Figure(data=go.Isosurface(
x = X.flatten(),
y = Y.flatten(),
z = Z.flatten(),
value = superquadrics(a,b,c,n1,n2,X,Y,Z).flatten(),
isomin = .5,
isomax = 1,
showscale = False,
))
st.write(fig)
おおまかな流れとしては、
-
def superquadrics
で超二次関数を定義 - パラメータを設定($c$, $n_1$, $n_2$ は、
streamlit
のスライダーを使用) -
np.mgrid
で、3次元座標を設定 -
go.Isosurface
で、plotly
によって 3Dモデルを描画
という手順となります。
なお、streamlit.io
にデプロイした Web アプリのソースコードについては、次の GitHub
で確認できます。
更新履歴
- 2021/08/09 初稿
参照
-
清水 毅, 小尾 誠, 遠山 茂樹, 古屋 信幸, 超二次関数モデルによる三次元物体の認識, 2004年度精密工学会秋季大会学術講演会講演論文集, pp.1049-1050, https://doi.org/10.11522/pscjspe.2004A.0.654.0 ↩