summaryrefslogtreecommitdiff
path: root/texmf-dist/scripts/ketpic/ketlib/ketpic2escifiles6/Koutenseg.sci
blob: 371807fab5335f11cc4d2acb176444838a2aee73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//
// 08.05.19
// 09.12.05

function  Out=Koutenseg(varargin)
   //pointdata on AB at which AB intersects CD
   Nargs=length(varargin);
   Eps0=10^(-4);
   A=varargin(1); V=varargin(2)-A;
   Sv2=V(1)^2+V(2)^2;
   if Sv2<10^(-6)
     Out=[%inf,-%inf];
     return
   end    
   P=varargin(3)-A; Q=varargin(4)-A;
   Eps=10.0^(-3);
   if Nargs>=5
     Eps=varargin(5);
   end
   Eps2=0.2;
   if Nargs>=6
     Eps2=varargin(6);
   end
   Eps=min(Eps2,Eps/sqrt(Sv2));
   P1=(P(1)*V(1)+P(2)*V(2))/Sv2;
   P2=(-P(1)*V(2)+P(2)*V(1))/Sv2;
   Q1=(Q(1)*V(1)+Q(2)*V(2))/Sv2;
   Q2=(-Q(1)*V(2)+Q(2)*V(1))/Sv2;
   m1=-Eps; M1=1+Eps;
   m2=-Eps; M2=Eps;
   if (max(P1,Q1)<m1) | (min(P1,Q1)>M1)
     Out=[%inf,-%inf];
     return
   end
   if (max(P2,Q2)<m2) | (min(P2,Q2)>M2)
     Out=[%inf,-%inf];
     return
   end
   if P2*Q2<0
     T=P1-(Q1-P1)/(Q2-P2)*P2;
     if (T>m1) & (T<M1)
       if (T>-Eps0) & (T<1+Eps0)
         Tmp1=A+T*V;
         Tmp2=min(max(T,0),1);
         Out=MixS(Tmp1,Tmp2,0);
       else
         Tmp1=A+T*V;
         Tmp2=min(max(T,0),1);
         Out=MixS(Tmp1,Tmp2,1);
       end
       return
     end
     if P1<m1 | P1>M1 | P2<m2 | P2>M2
       if Q1<m1 | Q1>M1 | Q2<m2 | Q2>M2
         Out=[%inf,-%inf];
         return
       end
       T=min(max(Q1,0),1);
       Tmp=A+T*V;
       Out=MixS(Tmp,T,1);
       return
     end
     T=min(max(P1,0),1);
     Tmp=A+T*V;
     Out=MixS(Tmp,T,1);
     return
   end
   if P1 > -Eps0 & P1 < 1 + Eps0 & P2 > -Eps0 & P2 < Eps0
     T= P1;
     Tmp=A+T*V;
     Out= MixS(Tmp, T, 0);
     return
   end
   if Q1 > -Eps0 & Q1 < 1 + Eps0 & Q2 > -Eps0 & Q2 < Eps0
     T= Q1;
     Tmp=A+T*V;
     Out=MixS(Tmp,T,0);
     return
   end
   if P1<m1 | P1>M1 | P2<m2 | P2>M2
     if Q1<m1 | Q1>M1 | Q2<m2 | Q2>M2
       Out=[%inf,-%inf];      
       return
     end
     T=min(max(Q1,0),1);
     Tmp=A+T*V;
     Out=MixS(Tmp,T,1);
     return
   end
   if Q1<m1 | Q1>M1 | Q2<m2 | Q2>M2
     T=min(max(P1,0),1);
     Tmp=A+T*V;
     Out=MixS(Tmp,T,1);
     return
   end
   if abs(P2)<abs(Q2)
       T=min(max(P1,0),1);
   else
       T=min(max(Q1,0),1);
   end
   Tmp=A+T*V;
   Out=MixS(Tmp,T,1);
endfunction