     
     fileprivate func union(_ other: ShapeRegion.Solid) -> ([ShapeRegion.Solid], Bool) {
         
-        if !self.bigBound.isIntersect(other.bigBound) {
+        if !self.boundary.isIntersect(other.boundary) {
             return ([self, other], false)
         }
         

        if self.isEmpty {
            return ShapeRegion()
        }
        if other.isEmpty || !self.bigBound.isIntersect(other.bigBound) {
            return self
        }
        
        if cache.subtracting[other.cacheId] == nil {
            let overlap = self.spacePartition.search(overlap: other.bigBound)
            var result: [Solid] = []
            result.reserveCapacity(solids.count)
            for (index, item) in self.solids.enumerated() {
                if overlap.contains(index) {
                    let overlap2 = other.spacePartition.search(overlap: item.bigBound)
                    result.append(contentsOf: overlap2.reduce([item]) { remains, idx in remains.flatMap { $0.subtracting(other.solids[idx]) } })
                } else {
                    result.append(item)

        var overlaps_index: [(Int, Int)] = []
        var overlap_r_index: Set<Int> = []
        var overlap_l_index: Set<Int> = []
        for r_idx in right_spaces.search(overlap: left.boundary) {
            let r_segment = right.bezier[r_idx]
            for l_idx in left_spaces.search(overlap: r_segment.boundary) {
                let l_segment = left.bezier[l_idx]
                if let intersect = l_segment.intersect(r_segment) {
                    for (t1, t2) in intersect {
