     public func intersects(component other: PathComponent, threshold: CGFloat = BezierKit.defaultIntersectionThreshold) -> [PathComponentIntersection] {
         precondition(other !== self, "use intersects(threshold:) for self intersection testing.")
         var intersections: [PathComponentIntersection] = []
-        self.bvh.intersects(node: other.bvh) { o1, o2, i1, i2 in
-            let c1 = o1 as! BezierCurve
-            let c2 = o2 as! BezierCurve
+        self.bvh.intersects(node: other.bvh) { i1, i2 in
+            let c1 = self.curves[i1]
+            let c2 = other.curves[i2]
             let elementIntersections = c1.intersects(curve: c2, threshold: threshold)
             let pathComponentIntersections = elementIntersections.compactMap { (i: Intersection) -> PathComponentIntersection? in
                 let i1 = IndexedPathComponentLocation(elementIndex: i1, t: i.t1)

    
    public func intersects(threshold: CGFloat = BezierKit.defaultIntersectionThreshold) -> [PathComponentIntersection] {
        var intersections: [PathComponentIntersection] = []
        self.bvh.intersects(node: self.bvh) { o1, o2, i1, i2 in
            let c1 = o1 as! BezierCurve
            let c2 = o2 as! BezierCurve
            var elementIntersections: [Intersection] = []
            // TODO: fix behavior for `crossingsRemoved` when there are self intersections at t=0 or t=1 and re-enable
            /*if i1 == i2 {

            }
            else*/ if i1 < i2 {
                // we are intersecting two distinct path elements
                let c1 = self.curves[i1]
                let c2 = self.curves[i2]
                elementIntersections = c1.intersects(curve: c2, threshold: threshold).filter {
                    if i1 == Utils.mod(i2-1, self.curves.count) && $0.t1 == 1.0 {
                        return false // exclude intersections of i and i+1 at t=1
