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

任意の点とBezier曲線とで最小となる長さ(距離)を求める

任意の点ZとBezier曲線Bezier(t)とで最小となる長さL(距離)を求める

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

任意の点ZとBezier曲線Bezier(t)との長さL
Anchor0=(a,p)Handle0=(b,q)Handle1=(c,r)Anchor1=(d,s)Bezier(t|Anchor0,Handle0,Handle1,Anchor1)=(X(t|a,b,c,d),Y(t|p,q,r,s))t[0,1]3 X(t|a,b,c,d)=a(1t)3+3b(1t)2t+3c(1t)t2+dt3=a(13t+3t2t3)+3b(t2t2+t3)+3c(t2t3)+dt3=a+3(a+b)t+3(a2b+c)t2+(a+3b3c+d)t3=A+3Bt+3Ct2+Dt3A=a,B=a+b,C=a2b+c,D=a+3b3c+d=X(t|A,B,C,D)Y(t|p,q,r,s)=p(1t)3+3q(1t)2t+3r(1t)t2+st3=a+3(p+q)t+3(p2q+r)t2+(p+3q3r+s)t3=P+3Qt+3Rt2+St3P=p,Q=p+q,R=p2q+r,S=p+3q3r+s=Y(t|P,Q,R,S)

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

ddtX(t)=3B+6Ct+3Dt2=3(B+2Ct+Dt2)ddtY(t)=3Q+6Rt+3St2=3(Q+2Rt+St2)

任意の点Zからベジェ曲線のX(t),Y(t)の距離

Z=(zx,zy)L=(X(t|a,b,c,d)zx)2+(Y(t|p,q,r,s)zy)2zBezier Z=(0,0)になるようにzx,zyだけ,a,b,c,d,p,q,r,sを平行移動する.距離は変わらないのでLL=X2(t|azx,bzx,czx,dzx)+Y2(t|pzy,qzy,rzy,szy) 平行移動後の係数を改めてa=azx,b=bzx,c=czx,d=dzx,p=pzy,q=qzy,r rzy,s=szyと定義し直して計算を続ける. L=(X(t|a,b,c,d))2+(Y(t|p,q,r,s))2=(X(t|A,B,C,D))2+(Y(t|P,Q,R,S))2A=a,B=a+b,C=a2b+c,D=a+3b3c+dP=p,Q=p+q,R=p2q+r,S=p+3q3r+s

Lを極値とするtを求める

ddtL=0L0tLL ddtL=12(X2(t)+Y2(t))12{ddt(X2(t)+Y2(t))}=12(X2(t)+Y2(t))12{(ddtX2(t))+(ddtY2(t))}=12(X2(t)+Y2(t))12{2X(t)(ddtX(t))+2Y(t)(ddtY(t))}=X(t)(ddtX(t))+Y(t)(ddtY(t))X2(t)+Y2(t)00 0=X(t)(ddtX(t))+Y(t)(ddtY(t))=(A+3Bt+3Ct2+Dt3)3(B+2Ct+Dt2)+(P+3Qt+3Rt2+St3)3(Q+2Rt+St2)=3{(A+3Bt+3Ct2+Dt3)(B+2Ct+Dt2)+(P+3Qt+3Rt2+St3)(Q+2Rt+St2)}0=(A+3Bt+3Ct2+Dt3)(B+2Ct+Dt2)+(P+3Qt+3Rt2+St3)(Q+2Rt+St2)30=A(B+2Ct+Dt2)+3Bt(B+2Ct+Dt2)+3Ct2(B+2Ct+Dt2)+Dt3(B+2Ct+Dt2)+P(Q+2Rt+St2)+3Qt(Q+2Rt+St2)+3Rt2(Q+2Rt+St2)+St3(Q+2Rt+St2)=AB+2ACt+ADt2+3B2t+6BCt2+3BDt3+3BCt2+6C2t3+3CDt4+BDt3+2CDt4+D2t5+PQ+2PRt+PSt2+3Q2t+6QRt2+3QSt3+3QRt2+6R2t3+3RSt4+QSt3+2RSt4+S2t5=AB+(2AC+3B2)t+(AD+9BC)t2+(4BD+6C2)t3+5CDt4+D2t5+PQ+(2PR+3Q2)t+(PS+9QR)t2+(4QS+6R2)t3+5RSt4+S2t5=A+Bt+Ct2+Dt3+Et4+Ft5+P+Qt+Rt2+St3+Tt4+Ut5A=AB,B=2AC+3B2,C=AD+9BC,D=4BD+6C2,E=5CD,F=D2P=PQ,Q=2PR+3Q2,R=PS+9QR,S=4QS+6R2,T=5RS,U=S2=(A+P)+(B+Q)t+(C+R)t2+(D+S)t3+(E+T)t4+(F+U)t5=α0+α1t+α2t2+α3t3+α4t4+α5t5α0=A+P=AB+PQα1=B+Q=2AC+3B2+2PR+3Q2α2=C+R=AD+9BC+PS+9QRα3=D+S=4BD+6C2+4QS+6R2α4=E+T=5CD+5RSα5=F+U =D2+S2A=a,B=a+b,C=a2b+c,D=a+3b3c+dP=p,Q=p+q,R=p2q+r,S=p+3q3r+sa=azx,b=bzx,c=czx,d=dzxp=pzy,q=qzy,r rzy,s=szy
tを求めるには この5次方程式を解けばよいが,5次ということで数値計算で解く等が必要.
解は5つあるわけだが,その内実数であるものを選ぶ.
また,t[0,1]であるので,t<0ならt=0t>1ならt=1とする.
この式は任意点からBezier曲線上の各点へ引いた線分の中で,接線とが直角に交わる時の点を求める方程式に等しい.

最小となるLを求める

得られたtLを極値とするものなので,その中でもLが最小となるものを採用する.

0 件のコメント:

コメントを投稿