All files / tools/src/utilities/contourSegmentation polylineXor.ts

0% Statements 0/27
0% Branches 0/18
0% Functions 0/1
0% Lines 0/25

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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                                                                                                                                     
import type { Types } from '@cornerstonejs/core';
import { cleanupPolylines } from './sharedOperations';
import arePolylinesIdentical from '../math/polyline/arePolylinesIdentical';
import { subtractPolylineSets } from './polylineSubtract';
import type { PolylineInfoCanvas } from './polylineInfoTypes';
import { areViewReferencesEqual } from './areViewReferencesEqual';
 
/**
 * Performs the XOR (exclusive or) operation on two sets of polylines.
 * Returns polylines that are in one set or the other, but not both (by polyline and viewReference).
 * If both sets are identical, returns an empty array.
 *
 * @param polylinesSetA The first set of PolylineInfoCanvas
 * @param polylinesSetB The second set of PolylineInfoCanvas
 * @returns Array of PolylineInfoCanvas that are unique to each set
 */
export function xorPolylinesSets(
  polylinesSetA: PolylineInfoCanvas[],
  polylinesSetB: PolylineInfoCanvas[]
): PolylineInfoCanvas[] {
  if (!polylinesSetA.length && !polylinesSetB.length) {
    return [];
  }
  if (!polylinesSetA.length) {
    return polylinesSetB;
  }
  if (!polylinesSetB.length) {
    return polylinesSetA;
  }
  if (polylinesSetA.length === polylinesSetB.length) {
    let allIdentical = true;
    for (let i = 0; i < polylinesSetA.length; i++) {
      let foundMatch = false;
      for (let j = 0; j < polylinesSetB.length; j++) {
        if (
          !areViewReferencesEqual(
            polylinesSetA[i].viewReference,
            polylinesSetB[j].viewReference
          )
        ) {
          continue; // Skip if view references are not equal
        }
        if (
          arePolylinesIdentical(
            polylinesSetA[i].polyline,
            polylinesSetB[j].polyline
          )
        ) {
          foundMatch = true;
          break;
        }
      }
      if (!foundMatch) {
        allIdentical = false;
        break;
      }
    }
    if (allIdentical) {
      return [];
    }
  }
  const aMinusB = subtractPolylineSets(polylinesSetA, polylinesSetB);
  const bMinusA = subtractPolylineSets(polylinesSetB, polylinesSetA);
  const xorResult = [...aMinusB, ...bMinusA];
  return xorResult;
}