0001 function [tMin,fMin,tBreak1,tBreak2,tMinAll]=essential_distMinAnglePair_base(Q211,Q212)
0002 flagCheckFirstDer=true;
0003 flagUseNewton=true;
0004 tolMZero=1e-15;
0005 tMinAll=[];
0006
0007 [tBreak1,~,~,c1,m1,p1]=essential_distMinAnglePair_discontinuityDistance(Q211);
0008 [tBreak2,~,~,c2,m2,p2]=essential_distMinAnglePair_discontinuityDistance(Q212);
0009
0010
0011 if abs(m1)<tolMZero && abs(m2)<tolMZero
0012 tMin=0;
0013 fMin=2*pi^2;
0014 tMinAll=0;
0015 else
0016
0017
0018 if abs(modAngle(tBreak1-tBreak2))<1e-8
0019 tMin=tBreak1+pi;
0020 fMin=0;
0021
0022
0023
0024
0025
0026 else
0027 tSearch1=tBreak1;
0028 tSearch2=tBreak2;
0029 if tSearch1>tSearch2
0030 tSearch1=tSearch1-2*pi;
0031 end
0032
0033 if flagCheckFirstDer
0034
0035 df1Break1=essential_distMinAnglePair_computeDfBreak(tBreak1,Q211);
0036 df2Break2=essential_distMinAnglePair_computeDfBreak(tBreak2,Q212);
0037
0038
0039
0040
0041 theta1Break2=acos(clip((m1*sin(tBreak2+p1)+c1-1)/2));
0042 df1Break2=-theta1Break2*(m1*cos(tBreak2+p1))/(2*sin(theta1Break2));
0043 theta2Break1=acos(clip((m2*sin(tBreak1+p2)+c2-1)/2));
0044 df2Break1=-theta2Break1*(m2*cos(tBreak1+p2))/(2*sin(theta2Break1));
0045
0046
0047 dfBreak1n=+df1Break1+df2Break1;
0048 dfBreak1p=-df1Break1+df2Break1;
0049 dfBreak2n=+df2Break2+df1Break2;
0050 dfBreak2p=-df2Break2+df1Break2;
0051
0052 flagSearch1=false;
0053
0054
0055 if sign(dfBreak1p)~=sign(dfBreak2n)
0056 if flagUseNewton
0057
0058 tMin0=tSearch1-dfBreak1p*(tSearch2-tSearch1)/(dfBreak2n-dfBreak1p);
0059
0060 [tMin,fMin]=essential_distMinAnglePair_dfNewton(m1,p1,c1,m2,p2,c2,tMin0,tSearch1,tSearch2);
0061
0062 else
0063 [tMin,fMin]=fminbnd(essential_distMinAnglePair_ft,tSearch1,tSearch2);
0064 end
0065 tMinAll=[tMinAll tMin];
0066 flagSearch1=true;
0067 end
0068 tSearch1=tSearch1+2*pi;
0069 if sign(dfBreak2p)~=sign(dfBreak1n)
0070 if flagUseNewton
0071
0072 tMin0=tSearch2-dfBreak2p*(tSearch1-tSearch2)/(dfBreak1n-dfBreak2p);
0073
0074 [tMin2,fMin2]=essential_distMinAnglePair_dfNewton(m1,p1,c1,m2,p2,c2,tMin0,tSearch2,tSearch1);
0075
0076 else
0077 [tMin2,fMin2]=fminbnd(essential_distMinAnglePair_ft,tSearch2,tSearch1);
0078 end
0079 if ~flagSearch1 || (flagSearch1 && fMin2<fMin)
0080 tMin=tMin2;
0081 fMin=fMin2;
0082 end
0083 tMinAll=[tMinAll tMin2];
0084 end
0085 else
0086 [tMin1,fMin1]=fminbnd(essential_distMinAnglePair_ft,tSearch1,tSearch2);
0087 tSearch1=tSearch1+2*pi;
0088 [tMin2,fMin2]=fminbnd(essential_distMinAnglePair_ft,tSearch2,tSearch1);
0089 if fMin1<fMin2
0090 tMin=tMin1;
0091 fMin=fMin1;
0092 else
0093 tMin=tMin2;
0094 fMin=fMin2;
0095 end
0096 end
0097 end
0098 end
0099
0100 function v=clip(v)
0101 v=min(1,max(-1,v));
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126