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

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

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

準備1

(1t)3=13t+3t2t3(1t)2t=t2t2+t3(1t)t2=t2t3(1t)2=12t+t2(1t)t=tt2

準備2

Poriginal0=(x0,y0)Poriginal1=(x1,y1)Poriginal2=(x2,y2)Poriginal3=(x3,y3)Z=(zx,zy) Zを原点0,0に移動させるように各点を平行移動する.平行移動しても求めるtは変わらない. P0=(x0zx,y0zy)=(a,p)ZP1=(x1zx,y1zy)=(b,q)ZP2=(x2zx,y2zy)=(c,r)ZP3=(x3zx,y3zy)=(d,s)Z

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

Bezier(t|P0,P1,P2,P3)=(X(t|a,b,c,d),Y(t|p,q,r,s))t[0,1]3X(t|a,b,c,d)=a(1t)3+3b(1t)2t+3c(1t)t2+dt3=a(13t+3t2t3)+3b(t2t2+t3)+3c(t2t3)+dt3=a3at+3at2at3+3bt6bt2+3bt3+3ct23ct3+dt3=a3at+3bt+3at26bt2+3ct2at3+3bt33ct3+dt3=a+(3a+3b)t+(3a6b+3c)t2+(a+3b3c+d)t3=A+3Bt+3Ct2+Dt3A=a,B=a+b,C=a2b+c,D=a+3b3c+dY(t|p,q,r,s)=p(1t)3+3q(1t)2t+3r(1t)t2+st3=a+(3p+3q)t+(3p6q+3r)t2+(p+3q3r+s)t3=P+3Qt+3Rt2+St3P=p,Q=p+q,R=p2q+r,S=p+3q3r+s

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

ddtX(t)=3B+6Ct+3Dt2ddtY(t)=3Q+6Rt+3St2 任意の点Z(zx,zy)とBezier曲線上の点Bezier(t|Poriginal0,Poriginal1,Poriginal2,Poriginal3)とのベクトル p=(X(t|Poriginal0,Poriginal1,Poriginal2,Poriginal3)zx,Y(t|Poriginal0,Poriginal1,Poriginal2,Poriginal3)zy) 平行移動したP0=(a,p),P1=(b,q),P2=(c,r),P3=(d,s)を用いると任意の点Z(zx,zy)は原点(0,0)になるので以下のように表せる. p=(X(t|a,b,c,d),Y(t|p,q,r,s))=(A+3Bt+3Ct2+Dt3,P+3Qt+3Rt2+St3) またこの時のBezier曲線上の点の接線は以下となる. q=(ddtX(t|a,b,c,d),ddtY(t|p,q,r,s))=(3B+6Ct+3Dt2,3Q+6Rt+3St2) この両ベクトルが直角をなす時,つまり内積が0となる時のtを求める. pq=|p||q|cos(π2)=|p||q|0=0θpqπ2cos(π2)=000=pq=pxqx+pyqy=X(t|a,b,c,d)(ddtX(t|a,b,c,d))+Y(t|p,q,r,s)(ddtY(t|p,q,r,s))=(A+3Bt+3Ct2+Dt3)(3B+6Ct+3Dt2)+(P+3Qt+3Rt2+St3)(3Q+6Rt+3St2)=A(3B+6Ct+3Dt2)+3Bt(3B+6Ct+3Dt2)+3Ct2(3B+6Ct+3Dt2)+Dt3(3B+6Ct+3Dt2)+P(3Q+6Rt+3St2)+3Qt(3Q+6Rt+3St2)+3Rt2(3Q+6Rt+3St2)+St3(3Q+6Rt+3St2)=3AB+6ACt+3ADt2+9B2t+18BCt2+9BDt3+9BCt2+18C2t3+9CDt4+3BDt3+6CDt4+3D2t5+3PQ+6PRt+3PSt2+9Q2t+18QRt2+9QSt3+9QRt2+18R2t3+9RSt4+3QSt3+6RSt4+3S2t5=3AB+3(2AC+3B2)t+3(AD+9BC)t2+3(4BD+6C2)t3+35CDt4+3D2t5+3PQ+3(2PR+3Q2)t+3(PS+9QR)t2+3(4QS+6R2)t3+35RSt4+3S2t5=3(AB+(2AC+3B2)t+(AD+9BC)t2+(4BD+6C2)t3+5CDt4+D2t5)+3(PQ+(2PR+3Q2)t+(PS+9QR)t2+(4QS+6R2)t3+5RSt4+S2t5)0=AB+(2AC+3B2)t+(AD+9BC)t2+(4BD+6C2)t3+5CDt4+D2t5+PQ+(2PR+3Q2)t+(PS+9QR)t2+(4QS+6R2)t3+5RSt4+S2t530=(AB+PQ)+(2AC+3B2+2PR+3Q2)t+(AD+9BC+PS+9QR)t2+(4BD+6C2+4QS+6R2)t3+(5CD+5RS)t4+(D2+S2)t5=α0+α1t+α2t2+α3t3+α4t4+α5t5α0=AB+PQα1=2AC+3B2+2PR+3Q2α2=AD+9BC+PS+9QRα3=4BD+6C2+4QS+6R2α4=5CD+5RSα5=D2+S2A=a,B=a+b,C=a2b+c,D=a+3b3c+dP=p,Q=p+q,R=p2q+r,S=p+3q3r+s
tを求めるには この5次方程式を解けばよいが,5次ということで数値計算で解く等が必要.
解は5つあるわけだが,その内実数であるものを選ぶ.
また,t[0,1]であるので,t<0ならt=0t>1ならt=1とする.
この式はBezier曲線と任意点との距離の凾数を微分して得る方程式に等しい

0 件のコメント:

コメントを投稿