plottertools / hatched

Convert images to plotter-friendly hatched patterns
MIT License
95 stars 9 forks source link

Shapely error #3

Open mssmison opened 3 years ago

mssmison commented 3 years ago

I'm running into this error:

ERROR:shapely.geos:TopologyException: Input geom 0 is invalid: Ring Self-intersection at or near point 96 320 at 96 320 Error: The operation 'GEOSDifference_r' could not be performed. Likely cause is invalidity of the geometry <shapely.geometry.polygon.Polygon object at 0x00000268A8F91DF0>

abey79 commented 3 years ago

Hello, could you provide the exact command used as well as the image in question?

mssmison commented 3 years ago

Hi, You bet!

vpype hatched --levels 64 128 192 -s 0.5 -p 4 starwars.jpg layout a4 show

starwars

mssmison commented 3 years ago

Good day, Have you had a chance to review this issue? I've tried a couple more images and am getting a similar error.

On Thu., Apr. 15, 2021, 9:55 a.m. Antoine Beyeler @.***> wrote:

Hello, could you provide the exact command used as well as the image in question?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/plottertools/hatched/issues/3#issuecomment-820582044, or unsubscribe https://github.com/notifications/unsubscribe-auth/AABUNMOBW2UNGZHQX256ZYLTI4K6LANCNFSM426UZW6Q .

abey79 commented 3 years ago

Sorry for the response time.

This plug-in is indeed not very robust and this crash happens when the computed "zone" are geometrically too complex. It wouldn't be very difficult to improve but this is unfortunately rather low in my priority list.

The easiest way to deal with these errors is to use the --blur parameter, e.g.:

vpype hatched --levels 64 128 200  -b 20 -p 4 -d starwars.jpg
image

Changing the levels can also help since the zone geometry is largely affected by them. Note that I use the -d parameter so hatched displays a "debug" view of the zones.

mssmison commented 3 years ago

No need to apologize! Thank you very much for sharing your work to begin with.

Cheers!

On Wed., Apr. 28, 2021, 2:11 a.m. Antoine Beyeler @.***> wrote:

Sorry for the response time.

This plug-in is indeed not very robust and this crash happens when the computed "zone" are geometrically too complex. It wouldn't be very difficult to improve but this is unfortunately rather low in my priority list.

The easiest way to deal with these errors is to use the --blur parameter, e.g.:

vpype hatched --levels 64 128 200 -b 20 -p 4 -d starwars.jpg

[image: image] https://user-images.githubusercontent.com/49431240/116377835-dff1ac80-a811-11eb-93c9-121d56ca2048.png

Changing the levels can also help since the zone geometry is largely affected by them. Note that I use the -d parameter so hatched displays a "debug" view of the zones.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/plottertools/hatched/issues/3#issuecomment-828292237, or unsubscribe https://github.com/notifications/unsubscribe-auth/AABUNMINEW6F2FUKEHQ5X6LTK7GMPANCNFSM426UZW6Q .

mariana-s-fernandes commented 2 years ago

Hi @abey79 I don't mind taking this one next. But I have no idea on the process to fix it. If you give me some lights I can pick this up and try to fix it

abey79 commented 2 years ago

@mariana-s-fernandes Honestly, I don't recall what I had in mind when I wrote the comment above. Basically these errors arise when the shape of the various zones become too complex and somehow result in some invalid Shapely polygon. Smoothing the input image helps by simplifying the zones and reducing the risk of them becoming invalid for Shapely.

Properly handling this probably entails: 1) Properly detecting the situation (e.g. checking for .valid at various steps, possibly identifying the nature of invalidity). 2) Fixing the shape. This is much tricker and I don't think there is any single good way of doing it. Maybe doing a tiny bit of double buffer (with positive then negative offset)? Maybe delete some probably-useless, tiny polygons from the input?

mariana-s-fernandes commented 2 years ago

I have run the code above using the new hatched version (with the shapely updates) and I don't get the error. But I will test with other examples