間違いしかありません.コメントにてご指摘いただければ幸いです(気が付いた点を特に断りなく頻繁に書き直していますのでご注意ください).

Bezier曲線上の各点における接線ベクトルqと,その各点から任意の点zへのベクトルpとの内積が0となる媒介変数tを探す

Bezier曲線上の各点における接線ベクトル\(\vec{q}\)と,その各点から任意の点\(z\)へのベクトル\(\vec{p}\)との内積が\(0\)となる媒介変数\(t\)を探す

準備1

$$\begin{eqnarray} (1-t)^3&=&1-3t+3t^2-t^3 \\(1-t)^2t&=&t-2t^2+t^3 \\(1-t)t^2&=&t^2-t^3 \\(1-t)^2&=&1-2t+t^2 \\(1-t)t&=&t-t^2 \end{eqnarray}$$

準備2

$$\begin{eqnarray} \\P_{\mathrm{original}0}&=&(x_0, y_0)\;\cdots\;通過点 \\P_{\mathrm{original}1}&=&(x_1, y_1)\;\cdots\;制御点 \\P_{\mathrm{original}2}&=&(x_2, y_2)\;\cdots\;制御点 \\P_{\mathrm{original}3}&=&(x_3, y_3)\;\cdots\;通過点 \\Z&=&(z_x,z_y)\;\cdots\;任意の点 \end{eqnarray}$$ \(Z\)を原点\(0,0\)に移動させるように各点を平行移動する.平行移動しても求める\(t\)は変わらない. $$\begin{eqnarray} \\P_0&=&(x_0-z_x, y_0-z_y)=(a, p)\;\cdots\;Zを原点に移動させるように平行移動した通過点 \\P_1&=&(x_1-z_x, y_1-z_y)=(b, q)\;\cdots\;Zを原点に移動させるように平行移動した制御点 \\P_2&=&(x_2-z_x, y_2-z_y)=(c, r)\;\cdots\;Zを原点に移動させるように平行移動した制御点 \\P_3&=&(x_3-z_x, y_3-z_y)=(d, s)\;\cdots\;Zを原点に移動させるように平行移動した通過点 \end{eqnarray}$$

3次のベジェ曲線(媒介変数\(t\)表示)

$$\begin{eqnarray} \\\mathrm{Bezier}(t|P_0,P_1,P_2,P_3)&=&\left(X(t|a,b,c,d),Y(t|p,q,r,s)\right)\;t\in[0, 1]\;\cdots\;3次のベジェ曲線 \\X(t|a,b,c,d)&=&a(1-t)^3+3b(1-t)^2t+3c(1-t)t^2+d\;t^3 \\&=&a(1-3t+3t^2-t^3)+3b(t-2t^2+t^3)+3c(t^2-t^3)+dt^3\;\cdots\;準備\;参照 \\&=&a-3at+3at^2-at^3+3bt-6bt^2+3bt^3+3ct^2-3ct^3+dt^3 \\&=&a-3at+3bt+3at^2-6bt^2+3ct^2-at^3+3bt^3-3ct^3+dt^3 \\&=&a+(-3a+3b)t+(3a-6b+3c)t^2+(-a+3b-3c+d)t^3 \\&=&A+3Bt+3Ct^2+Dt^3 \;\cdots\;A=a, B=-a+b, C=a-2b+c, D=-a+3b-3c+d \\Y(t|p,q,r,s)&=&p(1-t)^3+3q(1-t)^2t+3r(1-t)t^2+st^3 \\&=&a+(-3p+3q)t+(3p-6q+3r)t^2+(-p+3q-3r+s)t^3 \\&=&P+3Qt+3Rt^2+St^3 \;\cdots\;P=p, Q=-p+q, R=p-2q+r, S=-p+3q-3r+s \end{eqnarray}$$

3次のベジェ曲線の\(X(t), Y(t)\)の微分

$$\begin{eqnarray} \\\frac{\mathrm{d}}{\mathrm{d}t}X(t) &=&3B+6Ct+3Dt^2 \\\frac{\mathrm{d}}{\mathrm{d}t}Y(t) &=&3Q+6Rt+3St^2 \end{eqnarray}$$ 任意の点\(Z(z_x,z_y)\)とBezier曲線上の点\(\mathrm{Bezier}(t|P_{\mathrm{original}0},P_{\mathrm{original}1},P_{\mathrm{original}2},P_{\mathrm{original}3})\)とのベクトル $$\begin{eqnarray} \vec{p}&=&\left(X(t|P_{\mathrm{original}0},P_{\mathrm{original}1},P_{\mathrm{original}2},P_{\mathrm{original}3})-z_x, Y(t|P_{\mathrm{original}0},P_{\mathrm{original}1},P_{\mathrm{original}2},P_{\mathrm{original}3})-z_y\right) \end{eqnarray}$$ 平行移動した\(P_0=(a,p),P_1=(b,q),P_2=(c,r),P_3=(d,s)\)を用いると任意の点\(Z(z_x,z_y)\)は原点\((0,0)\)になるので以下のように表せる. $$\begin{eqnarray} \vec{p}&=&\left(X(t|a,b,c,d), Y(t|p,q,r,s)\right) \\&=&\left(A+3Bt+3Ct^2+Dt^3, P+3Qt+3Rt^2+St^3\right) \end{eqnarray}$$ またこの時のBezier曲線上の点の接線は以下となる. $$\begin{eqnarray} \vec{q}&=&\left(\frac{\mathrm{d}}{\mathrm{d}t}X(t|a,b,c,d),\frac{\mathrm{d}}{\mathrm{d}t}Y(t|p,q,r,s)\right) \\&=&\left(3B+6Ct+3Dt^2,3Q+6Rt+3St^2\right) \end{eqnarray}$$ この両ベクトルが直角をなす時,つまり内積が\(0\)となる時の\(t\)を求める. $$\begin{eqnarray} \vec{p}\cdot\vec{q}&=&|\vec{p}||\vec{q}|\cos{\left(\frac{\pi}{2}\right)}=|\vec{p}||\vec{q}|\cdot0=0 \;\cdots\;\thetaは\vec{p}と\vec{q}のなす角で直角\frac{\pi}{2}とするので\cos{\left(\frac{\pi}{2}\right)}=0.よって内積全体も0. \\0&=&\vec{p}\cdot\vec{q}=p_x q_x+p_y q_y\;\cdots\;内積の成分表示 \\&=&X(t|a,b,c,d) \left(\frac{\mathrm{d}}{\mathrm{d}t}X(t|a,b,c,d)\right) +Y(t|p,q,r,s)\left(\frac{\mathrm{d}}{\mathrm{d}t}Y(t|p,q,r,s)\right) \\&=&\left(A+3Bt+3Ct^2+Dt^3\right)\left(3B+6Ct+3Dt^2\right)+\left(P+3Qt+3Rt^2+St^3\right)\left(3Q+6Rt+3St^2\right) \\&=&A\left(3B+6Ct+3Dt^2\right) +3Bt\left(3B+6Ct+3Dt^2\right) +3Ct^2\left(3B+6Ct+3Dt^2\right) +Dt^3\left(3B+6Ct+3Dt^2\right) \\&&+P\left(3Q+6Rt+3St^2\right) +3Qt\left(3Q+6Rt+3St^2\right) +3Rt^2\left(3Q+6Rt+3St^2\right) +St^3\left(3Q+6Rt+3St^2\right) \\&=&3AB +6ACt +3AD t^2 +9B^2t +18BCt^2 +9BDt^3 +9BCt^2 +18C^2t^3 +9CDt^4 +3BDt^3 +6CDt^4 +3D^2t^5 \\&&+3PQ +6PRt +3PS t^2 +9Q^2t +18QRt^2 +9QSt^3 +9QRt^2 +18R^2t^3 +9RSt^4 +3QSt^3 +6RSt^4 +3S^2t^5 \\&=&3AB +3(2AC+3B^2)t +3(AD+9BC)t^2 +3(4BD+6C^2)t^3 +3\cdot5CDt^4 +3D^2t^5 \\&&+3PQ +3(2PR+3Q^2)t +3(PS+9QR)t^2 +3(4QS+6R^2)t^3 +3\cdot5RSt^4 +3S^2t^5 \\&=&3\left(AB +(2AC+3B^2)t +(AD+9BC)t^2 +(4BD+6C^2)t^3 +5CD t^4 +D^2 t^5\right) \\&&+3\left(PQ +(2PR+3Q^2)t +(PS+9QR)t^2 +(4QS+6R^2)t^3 +5RSt^4 +S^2t^5\right) \\0&=&AB +(2AC+3B^2)t +(AD+9BC)t^2 +(4BD+6C^2)t^3 +5CDt^4 +D^2t^5 \\&&+PQ +(2PR+3Q^2)t +(PS+9QR)t^2 +(4QS+6R^2)t^3 +5RSt^4 +S^2t^5\;\cdots\;両辺3で割った.左辺は0なので変わらず. \\&=&(AB+PQ) +(2AC+3B^2+2PR+3Q^2)t +(AD+9BC+PS+9QR)t^2 +(4BD+6C^2+4QS+6R^2)t^3 +(5CD+5RS)t^4 +(D^2+S^2)t^5 \\&=&\alpha_0 +\alpha_1t +\alpha_2t^2 +\alpha_3t^3 +\alpha_4t^4 +\alpha_5t^5 \\&&\;\cdots\;\alpha_0=AB+PQ \\&&\;\cdots\;\alpha_1=2AC+3B^2+2PR+3Q^2 \\&&\;\cdots\;\alpha_2=AD+9BC+PS+9QR \\&&\;\cdots\;\alpha_3=4BD+6C^2+4QS+6R^2 \\&&\;\cdots\;\alpha_4=5CD+5RS \\&&\;\cdots\;\alpha_5=D^2+S^2 \\&&\;\cdots\;A=a, B=-a+b, C=a-2b+c, D=-a+3b-3c+d \\&&\;\cdots\;P=p, Q=-p+q, R=p-2q+r, S=-p+3q-3r+s \end{eqnarray}$$
\(t\)を求めるには この5次方程式を解けばよいが,5次ということで数値計算で解く等が必要.
解は5つあるわけだが,その内実数であるものを選ぶ.
また,\(t\in[0, 1]\)であるので,\(t\lt0\)なら\(t=0\),\(t\gt1\)なら\(t=1\)とする.
この式はBezier曲線と任意点との距離の凾数を微分して得る方程式に等しい

0 件のコメント:

コメントを投稿