LoginSignup
24
28

More than 5 years have passed since last update.

「おっぱい曲面」を3Dグラフで描く(1)

Last updated at Posted at 2014-07-08

『プログラミング言語 Julia でグラフを描画する』 でとりあえずサンプルを動かすことに成功したが、自分の(Julia言語の)プログラムで作ったデータを使ってグラフを描画するにはどうしたら良いかを調べることにした。

今回は『「おっぱい曲面」で学ぶ「Julia言語の実用テクニック」』を参考にして、3D空間に「おっぱい曲面」を描画するサンプルを作ってみた。
例によって、Julia で求めた計算結果を PyQtGraph でグラフ表示するようになっている。(環境を作って是非動かしてみてください)

  • Oppai.jl (Julia のソースコード)は、Python のソース内の graph_run() という関数に配列を渡す。グラフの描画は Python にお任せ。。
  • Oppai.py (Python のソースコード)では、Julia から渡された配列を基に3Dグラフを描画する(51個の折れ線グラフ)。
  • PyCall を用いて Python のコードを呼び出す際には、C:\julia-0.2.1-win32\bin がロードパスに含まれるので、Oppai.jl および Oppai.py の両方共を C:\julia-0.2.1-win32\bin 配下に保存しておくこと。
  • ソースコードを保存する際には文字エンコーディングは utf-8 にしておくこと。
  • サンプルを起動するには、Oppai.jl (Julia のソースコード) をエクスプローラーからダブルクリックする。

注記:環境構築については、『プログラミング言語 Julia でグラフを描画する』 を参照してください。

2014-0708-1055.png
↑マウスでドラッグしたりカーソルキーを押すと3Dグラフが回転します。マウスホイールを回すと拡大・縮小ができます。

Oppai.jl(C
# -*- coding: utf-8 -*-

function bust(x,y)
1/8* (6*exp(-((2/3*abs(x) - 1)^2 + (2/3 *y)^2) - 1/3*(2/3*y + 1/2)^3)+ 2/3 *exp(-2.818^11*((abs(2/3*x) - 1)^2+ (2/3 *y)^2)^2) + 2/3*y - (2/3*x)^4)
end

nx = 100
ny = 51
x = linspace(-3, 3, nx)
y = linspace(-3, 3, ny)
z = zeros(Float64, length(y), length(x))

for iy = 1:length(y)
    for ix = 1:length(x)
        z[iy, ix] = bust(x[ix], y[iy])
    end
end

using PyCall
@pyimport Oppai
Oppai.graph_run(x, y, z, 10)
Oppai.py(C
# -*- coding: utf-8 -*-

from pyqtgraph.Qt import QtCore, QtGui
import pyqtgraph.opengl as gl
import pyqtgraph as pg
import numpy as np

def graph_run(plot_data_x, plot_data_y, plot_data_z, distance):

    app = QtGui.QApplication([])

    w = gl.GLViewWidget()
    w.resize(600,400)
    w.opts['distance'] = distance
    w.show()
    w.setWindowTitle(u'Julia+PyQtGraph サンプル')

    x = plot_data_x
    y = plot_data_y
    for i in range(len(y)):
        yi = [y[i]]*len(x)
        z = plot_data_z[i,:]
        pts = np.vstack([x,yi,z]).transpose()
        plt = gl.GLLinePlotItem(pos=pts, color=pg.glColor((i,len(y)*1.3)), width=(i+1)/10., antialias=True)
        w.addItem(plt)

    app.exec_()
24
28
1

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
24
28