collectPairs method
Collect overlaping pairs
Implementation
@override
void collectPairs() {
if(numElementsD == 0 ) return;
SAPAxis axis1 = axesD[index1];
SAPAxis axis2 = axesD[index2];
axis1.sort();
axis2.sort();
int count1 = axis1.calculateTestCount();
int count2 = axis2.calculateTestCount();
Map<int,SAPElement?> elementsD;
Map<int,SAPElement?> elementsS;
if( count1 <= count2 ){// select the best axis
axis2 = axesS[index1];
axis2.sort();
elementsD = axis1.elements;
elementsS = axis2.elements;
}
else{
axis1 = axesS[index2];
axis1.sort();
elementsD = axis2.elements;
elementsS = axis1.elements;
index1 ^= index2;
index2 ^= index1;
index1 ^= index2;
}
SAPElement? activeD;
SAPElement? activeS;
int p = 0;
int q = 0;
while( p < numElementsD ){
SAPElement? e1;
bool dyn;
if (q == numElementsS){
e1 = elementsD[p];
dyn = true;
p++;
}
else{
SAPElement? d = elementsD[p];
SAPElement? s = elementsS[q];
if(d != null && s != null && d.value < s.value){
e1 = d;
dyn = true;
p++;
}
else{
e1 = s;
dyn = false;
q++;
}
}
if(e1 != null && !e1.max){
Shape s1 = e1.proxy.shape;
double min1 = e1.min1?.value ?? 0;
double max1 = e1.max1?.value ?? 0;
double min2 = e1.min2?.value ?? 0;
double max2 = e1.max2?.value ?? 0;
for(SAPElement? e2 = activeD; e2 != null; e2 = e2.pair){// test for dynamic
Shape s2 = e2.proxy.shape;
numPairChecks++;
if( min1 > e2.max1!.value || max1 < e2.min1!.value || min2 > e2.max2!.value || max2 < e2.min2!.value || !isAvailablePair( s1, s2 ) ) continue;
addPair( s1, s2 );
}
if( dyn ){
for(SAPElement? e2 = activeS; e2 != null; e2 = e2.pair) {// test for static
Shape s2 = e2.proxy.shape;
numPairChecks++;
if( min1 > e2.max1!.value || max1 < e2.min1!.value|| min2 > e2.max2!.value || max2 < e2.min2!.value || !isAvailablePair(s1,s2) ) continue;
addPair( s1, s2 );
}
e1.pair = activeD;
activeD = e1;
}
else{
e1.pair = activeS;
activeS = e1;
}
}
else{
SAPElement? min = e1?.pair!;
if( dyn ){
if( min == activeD ){
activeD = activeD?.pair;
continue;
}
else{
e1 = activeD;
}
}
else{
if( min == activeS ){
activeS = activeS?.pair;
continue;
}
else{
e1 = activeS;
}
}
while(e1 != null) {
SAPElement? e2 = e1.pair;
if(e2 == min ){
e1.pair = e2!.pair;
break;
}
e1 = e2;
}
}
}
index2 = (index1|index2)^3;
}