フォーラムの質問を見つけました...
Function intersectBezier3Line(x1#,y1#,vx1#,vy1#,x2#,y2#,vx2#,vy2#,L1x#,L1y#,L2x#,L2y#)
Local A#,B#,C#,E#,F#,G#,La#,Lb#,Lc#,Solution#
A=3*vx1+x2-(3*vx2)-x1
B=3*x1-(6*vx1)+(3*vx2)
C=3*vx1-(3*x1)
E=3*vy1+y2-(3*vy2)-y1
F=3*y1-(6*vy1)+(3*vy2)
G=3*vy1-(3*y1)
La=L2y-L1y
Lb=L1x-L2x
Lc=L1y*(L2x-L1x) + L1x*(L1y-L2y)
ax(4)=La*x1 + Lb*y1 + Lc
ax(3)=La*C + Lb*G
ax(2)=La*B + Lb*F
ax(1)=La*A + Lb*E
FindRootsPoly3(ax(4),ax(3),ax(2),ax(1))
End Function
Function FindRootsPoly3(A3#,A2#,A1#,A0#)
Local fc2#,gc2#,hc2#,Rc2#,Sc2#,Tc2#,Uc2#,ic2#,jc2#,kc2#,Lc2#,Mc2#,Nc2#,Pc2#
fc2 =( (3*A1/A3) - ((A2^2)/(A3^2) ))/ 3
gc2=(( (2*A2^3)/(A3^3)) - (9*A2*A1/(A3^2)) + (27*A0/A3)) / 27
hc2 = ((gc2^2)/4) + ((fc2^3)/27)
If hc2>0 Then
Rc2 = -(gc2/2) + (Sqr(hc2))
If Rc2<0 Then
Sc2 = -(Abs(Rc2)^0.333333)
Else
Sc2 = ((Rc2))^0.333333
EndIf
Tc2 = -(gc2/2) -( Sqr(hc2))
If Tc2<0 Then
Uc2 = -(Abs(Tc2)^0.333333)
Else
Uc2 = (Tc2)^0.333333
EndIf
Rx(0) = (Sc2 + Uc2) - (A2/(3*A3))
Else
If hc2=0 And gc2=0 And fc2=0 Then
Rx(0) =-((A0/A3)^0.3333333 )
Else
If hc2<0 Or hc2=0 Then
ic2= Sqr(((gc2^2)/4) - hc2)
jc2 = (ic2)^0.333333
kc2 = ACos (- (gc2 / (2*ic2)))
Lc2 = -jc2
Mc2 = Cos (kc2/3)
Nc2 = Sqr( 3) * Sin (kc2/3)
Pc2 = -(A2/(3*A3))
Rx(0) = 2*jc2 * Cos(kc2/3) -(A2/(3*A3))
Rx(1) = Lc2 * (Mc2 + Nc2) + Pc2
Rx(2) = Lc2 * (Mc2 - Nc2) + Pc2
EndIf
EndIf
EndIf
End Function
線とベジエ曲線の交点を何らかの形で出力することを期待しています。私はコーヒースクリプトに翻訳しました
intersectBezier3Line = (x1,y1,vx1,vy1,x2,y2,vx2,vy2,L1x,L1y,L2x,L2y)->
A=3*vx1+x2-(3*vx2)-x1
B=3*x1-(6*vx1)+(3*vx2)
C=3*vx1-(3*x1)
E=3*vy1+y2-(3*vy2)-y1
F=3*y1-(6*vy1)+(3*vy2)
G=3*vy1-(3*y1)
La=L2y-L1y
Lb=L1x-L2x
Lc=L1y*(L2x-L1x) + L1x*(L1y-L2y)
ax = [
La*x1 + Lb*y1 + Lc
La*C + Lb*G
La*B + Lb*F
La*A + Lb*E
]
FindRootsPoly3 ax[3],ax[2],ax[1],ax[0]
pow = (x,y)-> Math.pow x,y
sqr = (x)-> x*x
FindRootsPoly3 = (A3,A2,A1,A0)->
fc2 = ((3*A1 / A3) - ( pow(A2,2) / pow(A3,2) ))/ 3
gc2 = (( (2*pow(A2,3)) / pow(A3,3)) - (9*A2*A1 / pow(A3,2)) + (27*A0 / A3)) / 27
hc2 = (pow(gc2,2)/4) + (pow(fc2,3)/27)
Rx = []
if hc2>0
Rc2 = -(gc2/2) + (sqr(hc2))
if Rc2<0
Sc2 = -(pow(Math.abs(Rc2),0.333333))
else
Sc2 = pow(((Rc2)),0.333333)
Tc2 = -(gc2/2) - ( sqr(hc2))
if Tc2<0
Uc2 = -pow(Math.abs(Tc2),0.333333)
else
Uc2 = pow((Tc2),0.333333)
Rx[0] = (Sc2 + Uc2) - (A2/(3*A3))
else
if hc2==0 and gc2==0 and fc2==0
Rx[0] = -pow((A0/A3),0.3333333 )
else
if hc2<0 or hc2==0
ic2 = sqr((pow(gc2,2)/4) - hc2)
jc2 = pow((ic2),0.333333)
kc2 = Math.acos( -(gc2 / (2*ic2)))
Lc2 = -jc2
Mc2 = Math.cos(kc2/3)
Nc2 = sqr( 3) * Math.sin(kc2/3)
Pc2 = -(A2/(3*A3))
Rx[0] = 2*jc2 * Math.cos(kc2 / 3) - (A2/(3*A3))
Rx[1] = Lc2 * (Mc2 + Nc2) + Pc2
Rx[2] = Lc2 * (Mc2 - Nc2) + Pc2
Rx
そして時々(いくつかの入力で)何かを出力しますが、ほとんどはNaN
and undefined
. 正確に何を出力すべきかわかりませんt
。最初のベジエ曲線の値ですか?
また、明らかに正しく機能していません。私の翻訳や最初のコードに何か問題があると思いますか?
javascript/coffeescript で、ベジエ曲線と線を数学的に交差させたいと思っています。