LoginSignup
2
2

More than 1 year has passed since last update.

Streamlit で超二次関数の 3D モデルを可視化する

Posted at

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次元形状の例を示します。

fig1.png fig2.png fig3.png

3. 3Dモデルによる可視化

streamlit で Web アプリを作成し、share.streamlit.io でデプロイしました。
具体的には下のような Web アプリで、左側のサイドバーにあるピンク色のスライダーでパラメータを調整すると、右側の3Dモデルが変化します。

streamlit.io.png

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 初稿

参照


  1. 清水 毅, 小尾 誠, 遠山 茂樹, 古屋 信幸, 超二次関数モデルによる三次元物体の認識, 2004年度精密工学会秋季大会学術講演会講演論文集, pp.1049-1050, https://doi.org/10.11522/pscjspe.2004A.0.654.0 

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2