2017-05-27 22:30:00

進捗報告

[トップページ] > [雑記] > 進捗報告

計算ミスで時間を取られるのはもったいない、ということで自動で計算してくれる SymPy を使ってみました。

SymPy の使い方がよくわからなかったので、試しに2点 (x0, y0), (x1, y1) を通る直線に (xp, yp) から垂線を下ろしたときの長さを求める問題を与えてみました。2線の交点を (xc, yc) としています。

x0 = sympy.Symbol('x0')
y0 = sympy.Symbol('y0')
x1 = sympy.Symbol('x1')
y1 = sympy.Symbol('y1')
xp = sympy.Symbol('xp')
yp = sympy.Symbol('yp')
xc = sympy.Symbol('xc')
yc = sympy.Symbol('yc')
x = sympy.Symbol('x')
t = sympy.Symbol('t')
eq1 = sympy.Eq(x0 + t * (x1 - x0), xc)
eq2 = sympy.Eq(y0 + t * (y1 - y0), yc)
eq3 = sympy.Eq((xp - xc) * (x1 - x0) + (yp - yc) * (y1 - y0), 0)
eq4 = sympy.Eq(x, ((xp - xc) ** 2 + (yp - yc) ** 2))
x = sympy.solve((eq1, eq2, eq3, eq4), [t, xc, yc, x])[0][-1]
print sympy.simplify(x)
# -> (x0*y1 - x0*yp - x1*y0 + x1*yp + xp*y0 - xp*y1)**2/(x0**2 - 2*x0*x1 + x1**2 + y0**2 - 2*y0*y1 + y1**2)

きちんと解けているみたいですね。分母は

# x0**2 - 2*x0*x1 + x1**2 + y0**2 - 2*y0*y1 + y1**2

ではなく

# (x0 - x1)**2 + (y0 - y1)**2

としてほしいところですが、やり方はよくわかりませんでした。sympy.simplify の ratio を変更してもだめ。

また、上記コードは距離の2乗を求めさせていますが、そのルートを求めさせるとなぜだか計算が終わらなくなります。


カーネギーメロン大学のコンピュータグラフィクスの講義の資料 [1] を読み進めています。

7. Perspective Projection and Texture Mapping


  1. CMU 15-462/662 COMPUTER GRAPHICS

[トップページ] > [雑記] > 進捗報告


Cpyright (C) 2014-2016 Hiroharu Kato. All Rights Reserved.