Мой код конечно не настолько мобилен. но вот он кажется попроще))
Function CircleIntersec(X1#,Y1#,R1#,X2#,Y2#,R2#)
vx#=X2-X1;
vy#=Y2-Y1;
vv#=vx*vx+vy*vy;
If ((R1+R2)*(R1+R2)<vv)
Return False;
Else
a#=(R1+R2)*(R1-R2)/2/vv+0.5;
b#=Sqr(R1*R1/vv-a*a);
P1[0]=X1+a*vx-b*vy;
P1[1]=Y1+a*vy+b*vx;
P2[0]=X1+a*vx+b*vy;
P2[1]=Y1+a*vy-b*vx;
Return True;
EndIf
End Function
В цикле
XHand#=xEntityX(point3)-xEntityX(Cup1_1)
YHand#=xEntityY(point3)-xEntityY(Cup1_1)
B#=Sqr(Ext(XHand)+Ext(YHand))
qq1#=ATan2#(YHand#,XHand#)
qq2#=(ACos#((Ext#(L1)-Ext#(L2)+Ext#(B))/(2*L1*B)))
If B>(L1+L2)
Q1#=0
Q2#=15
xPointEntity(Cup1_1,point3)
xRotateEntity(Cup1_1, 0, 0, -xEntityPitch(Cup1_1)+90)
Else
Q1#=qq1+qq2+90
Q2#=ACos#((Ext#(L1)+Ext#(L2)-Ext#(B))/(2*L1*L2))+180
xRotateEntity(Cup1_1, 0, 0, Q1)
xRotateEntity(Cup1_2, 0, 0, Q2)
EndIf
Я развиваю пока идею с точкой, чтобы можно было вертетьв трех плоскостях.