15

8

What is the best way to clip a graphic to a certain region?

Here's a very simple implementation to show what I mean:

```
Show[
CountryData["World", "Shape"],
Graphics[{White,
FilledCurve[{{Line[{{-200, -100}, {200, -100}, {200, 100}, {-200,
100}}]}, {Line[{{-10.181224213835492, 65.15571149065886},
{-4.290845998237188,
79.14535975270482}, {14.116585925507536,
63.683116936759234}, {16.32547775635689,
43.80309045911497},
{-0.6093596134882375,
35.70382041266731}, {-16.071602429433796,
40.85790135131583}, {-13.126413321634658,
57.79273872116096}}]}}]}],
PlotRange -> {{-18, 18}, {35, 82}}, Background -> LightBlue
]
```

My aim is to be able to clip arbitrary vector graphics to an arbitrary vector region. The region can be anything, and can have curved boundaries (but approximation with line segments is okay).

The problem with the approach I showed here (i.e. simply overlaying a rectangle with a hole in it) is that it is cumbersome and it does not allow arbitrary layering of objects: imagine that I need this clipped graphic to be in the foreground and cover parts of the background objects.

*Note:* It is possible to clip raster graphics using `Texture`

, as shown here. This question is about clipping arbitrary vector graphics. If it is not possible to do this in the current version of Mathematica, I accept that.

I can only second what @YvesKlett has said, pointing to Heike's graphics intersection solution, though I know you are aware of it. It is only helpful if you have simple polygons (i.e. no disconnected parts), and still - just as Yves said - you have to make the intersection for each polygon-pair...

– István Zachar – 2012-04-10T10:37:40.363Related: http://mathematica.stackexchange.com/q/1332/121

– Mr.Wizard – 2012-02-19T16:43:42.727@Mr.Wizard The difference is that here I'd like to clip vector graphics, if this is possible at all. Rasterization worsens the quality and increases the file size. – Szabolcs – 2012-02-19T16:45:04.143

2Absolutely. This question is what I initially thought that one was, and IMHO should have been. Unfortunately I still don't have an answer. I think to do this

properlyWRI needs to add a ClippingPath function. Here's hoping there is already some undocumented function that does this. – Mr.Wizard – 2012-02-19T16:48:00.850This would probably be doable in the old, version 5 graphics, which are based on PostScript. – Szabolcs – 2012-02-19T20:21:28.173

1@Szabolcs I don't think so. I used

`<< Version5``Graphics```

and as far as I can tell, the PostScript engine can only deal with rectangular clipping regions. – Lev Bishop – 2012-02-20T04:24:59.3132For current versions of Mathematica this is not possible AFAIK. You can do it the hard way by intersecting each edge of the to-be-clipped polygons with the mask polygon edges and deleting resulting outlier elements. This is a fair bit of work though. I have some hopes (and the urgent desire) of this being adressed in future versions at least for 2D cases. – Yves Klett – 2012-02-20T08:50:07.443