# Overlapping paths

• A quick and hopefully not-too-dumb question about BezierPath() overlaps: what's the Boolean operation would allow me to get rid of an overlap like the one in the upper-left-hand corner of this path? removeOverlap() erases the whole path …

(Gustavo, if you're reading this, I stole the diagram scheme and colors from you.)

• hello @MauriceMeilleur,

I’ve created a simplified version of your shape for testing (see below). remove overlap works as expected, the inner shape is preserved: ``````B = BezierPath()
B.moveTo((10, 90))
B.lineTo((90, 90))
B.lineTo((90, 10))
B.lineTo((10, 10))
B.lineTo((10, 90))
B.lineTo((40, 90))
B.lineTo((40, 40))
B.lineTo((60, 40))
B.lineTo((60, 60))
B.lineTo((10, 60))
B.closePath()

newPage(100, 100)
frameDuration(3)
fill(None)
stroke(1, 0, 0)
drawPath(B)

B.removeOverlap()

newPage(100, 100)
frameDuration(3)
fill(None)
stroke(1, 0, 0)
drawPath(B)

# saveImage('removeOverlapTest.gif')
``````

it would help if you could post your actual bezier points, so we can see if it’s a problem in the data.

ps. the color scheme is a nice reminder to add an illustration to the arcTo docs • Gustavo, thanks. Here's the path.points from the outline above. Sorry I haven't had a chance yet to get round() inserted into all the calculations where it needs to be, yet.

[(-125.0, 275.0),
(-125.0, -100.0),
(-125.0, -99.99999999999999),
(-125.0, -113.80711874576983),
(-113.80711874576983, -124.99999999999999),
(-100.0, -124.99999999999999),
(125.0, -125.0),
(125.0, 100.0),
(125.0, 100.0),
(125.0, 113.80711874576983),
(113.80711874576983, 125.0),
(100.0, 125.0),
(-275.0, 125.0),
(-275.0, 275.0),
(100.0, 275.0),
(99.99999999999999, 275.0),
(196.64983122038882, 275.0),
(275.0, 196.64983122038882),
(275.0, 100.0),
(275.0, -275.0),
(-100.0, -275.0),
(-100.00000000000003, -275.0),
(-196.64983122038888, -275.0),
(-275.0, -196.64983122038882),
(-275.0, -99.99999999999997),
(-275.0, 275.0),
(-125.0, 275.0)]

• By the way, here's the context. The appearance of the black-filled outline is correct, but I want to lose the overlap to allow me to layer and selectively remove copies of the outlines to create Schrofer's various stroke effects. • @MauriceMeilleur thanks for the points. remove overlap also works as expected with a `lineTo`-only version of the shape:

``````pts = [(-125.0, 275.0), (-125.0, -100.0), (-125.0, -99.99999999999999), (-125.0, -113.80711874576983), (-113.80711874576983, -124.99999999999999), (-100.0, -124.99999999999999), (125.0, -125.0), (125.0, 100.0), (125.0, 100.0), (125.0, 113.80711874576983), (113.80711874576983, 125.0), (100.0, 125.0), (-275.0, 125.0), (-275.0, 275.0), (100.0, 275.0), (99.99999999999999, 275.0), (196.64983122038882, 275.0), (275.0, 196.64983122038882), (275.0, 100.0), (275.0, -275.0), (-100.0, -275.0), (-100.00000000000003, -275.0), (-196.64983122038888, -275.0), (-275.0, -196.64983122038882), (-275.0, -99.99999999999997), (-275.0, 275.0), (-125.0, 275.0)]

B = BezierPath()
for i, pt in enumerate(pts):
if i == 0:
B.moveTo(pt)
else:
B.lineTo(pt)
B.closePath()

# (un)comment this line to test
# B.removeOverlap()

newPage(800, 800)
translate(400, 400)
fill(None)
stroke(1, 0, 0)
strokeWidth(8)
drawPath(B)
``````

I don’t think the lack of `curveTo`s plays a role in the result (but you never know).

let’s try it the other way around: can you provide a simple example in code of a shape where the whole path is erased when removing overlap? thanks!

• @gferreira As soon as I get a chance first thing in the AM. By the way and in case it matters (though I don't see why it should), the curves are drawn with arcTo().

• Okay, now I feel embarrassed: just tried a test, as follows:

``````canvas = 500

newPage(canvas, canvas)
translate(canvas/2, canvas/2)
path = BezierPath()
path.arc((0, 0), 200, 0, 540, False)
path.lineTo((-100, 0))
path.arc((0, 0), 100, 540, 0, True)
path.closePath()
stroke(0)
fill(None)
path.closePath()

path.removeOverlap()
drawPath(path)

saveImage('~/Desktop/overlap_test.png')
``````

and got this: Just what I thought should happen! So I tried again with the original code I'm working on—and I swear I put the removeOverlap() call in the same place—and here's the result: So, great! The function works as I originally thought it should! But, on the other hand, I have no idea why it wouldn't perform when I first tried it.

• A wild guess: if you have twice the same outline on top of each other, it is possible a remove overlap can freak out

Wild guess 2: you had some open paths, which are removed by a remove overlap

• I can't say for sure, but just thinking about the editing I'd been doing when I ran into the problem, open paths would be the more likely explanation. Anyway, it's working now—time to move on to new problems. 