Free-Form Deformation(FFD)ã使ç¨ãã¦2Dç»åã®å¤å½¢ãè¡ããã¨è©¦ã¿ã¦ããããFFDã¯ãã¸ã¨(Bezier)æ²é¢ã§è¡¨ããã座æ¨ç³»ã使ç¨ãã¦å¤å½¢ããã
ããã§ããã¸ã¨æ²ç·ã復ç¿ãå
¼ãã¦matplotlibã§æç»ãã¦ã¿ãã
ãã¸ã¨æ²ç·ã2次å
ã«æ¡å¼µããã¨ãã¸ã¨æ²é¢ã¨ãªãã
ã¾ãã¯ãåç´ãªãã¸ã¨æ²ç·ãæç»ããã
ãã¸ã¨æ²ç·ã®å®ç¾©
ãã¸ã¨æ²ç·ã¯æ¬¡å¼ã§è¡¨ãããæ²ç·ã§ããã
ã¯äºé
ä¿æ°ã§ã
ã¨è¡¨è¨ããå ´åãããã以ä¸ã®å¼ã§å±éãããã
ã¯ããã¼ã³ã¹ã¿ã¤ã³(Bernstein)å¤é
å¼ã¨å¼ã°ããã
ã¯å¶å¾¡ç¹ã§ãnã¯ãã¸ã¨æ²ç·ã®æ¬¡æ°ã§ããã
ãã¸ã¨æ²ç·ã¯ãå§ç¹ã¨çµç¹
ãéãã
Pythonã®ã³ã¼ãä¾
ãã¸ã¨æ²ç·ãPythonã§è¨è¿°ããã¨ä»¥ä¸ã®ããã«ãªãã
import scipy.misc as scm import numpy as np import matplotlib.pyplot as plt def bernstein(n, i, t): return scm.comb(n, i) * t**i * (1 - t)**(n-i) def bezier(n, t, q): p = np.zeros(2) for i in range(n + 1): p += bernstein(n, i, t) * q[i] return p q = np.array([[0, 0], [1, 1], [4, -1], [5, 0]], dtype=np.float) list = [] for t in np.linspace(0, 1, 100): list.append(bezier(3, t, q)) P = np.array(list) plt.plot(P.T[0], P.T[1]) plt.plot(q.T[0], q.T[1], '--o') plt.show()
äºé ä¿æ°ã¯ãscipy.misc.combã使ç¨ãã¦è¨ç®ãã¦ããã
ä¸è¨ã®ã³ã¼ãä¾ã§ã¯ãå¶å¾¡ç¹ã®æ¬¡æ°ã¯3ã§ãå¶å¾¡ç¹(0, 0)ã(1, 1)ã(4, -1)ã(5, 0)ã«ãã£ã¦è¡¨ããããã¸ã¨æ²ç·ãæç»ãã¦ããã
ãªããlist.appendã®é¨åããªã¹ãå å ã使ã£ã¦ããå°ãã¹ãã¼ãã«æ¸ãã¨ã
P = np.array([bezier(3, t, q) for t in np.linspace(0, 1, 100)])
ã®ããã«è¨è¿°ã§ããã
bezier颿°ã§Î£ã®è¨ç®ã«forã使ç¨ãã¦ãããã以ä¸ã®ããã«ãªã¹ãå å ã¨è¡åã®ç©ã使ç¨ãã¦ãè¨è¿°ã§ããã
np.dot([bernstein(n, i, t) for i in range(n + 1)], q)
numpyã®è¡åã¯ã横ãã¯ãã«ãªã®ã§ãè¡åã®ç©ãè¨ç®ããéã¯ééããªãããã«æ³¨æãå¿ è¦ã§ããã