collectPairs method

  1. @override
void collectPairs()
override

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;
}