102 HitSig stridedSig, noStridedSig;
103 if ( s1.
stride != 1 ) { stridedSig = s1; noStridedSig = s2; }
104 else { stridedSig = s2; noStridedSig = s1; }
109 int displacement = (noStridedSig.
begin - stridedSig.
begin) % stridedSig.
stride;
110 if ( displacement == 0 ) res.
begin = noStridedSig.
begin;
115 if ( noStridedSig.
end >= stridedSig.
end ) res.
end = stridedSig.
end;
116 else res.
end = noStridedSig.
end;
130 else { low = s2; high = s1; }
133 int displacement = high.
begin;
135 high.
end = high.
end - displacement;
137 low.
end = low.
end - displacement;
139 int lowerEnd = ( low.
end < high.
end ) ? low.
end : high.
end;
144 if ( norm < 0 ) norm = norm + low.
stride;
147 int gcd, lastx, lasty;
165 int jumps = norm / gcd;
166 int cycle = high.
stride / gcd;
168 if ( lasty < 0 ) multLowStride = jumps * -lasty % cycle;
169 else multLowStride = cycle - ( jumps * lasty % cycle );
171 int coincidence = norm + multLowStride * low.
stride;
174 if ( coincidence >= higherBegin ) res.
begin = coincidence;
176 int adjust = ( higherBegin - coincidence ) % lcm;
177 if ( adjust == 0 ) res.
begin = higherBegin;
178 else res.
begin = higherBegin + lcm - adjust;
187 res.
end = lowerEnd - ( lowerEnd - res.
begin ) % lcm;
190 res.
begin += displacement;
191 res.
end += displacement;
HitSig hit_sigIntersect(HitSig s1, HitSig s2)
void hit_utilExtendedEuclideanGCD(int a, int b, int *gcd, int *pLastx, int *pLasty)