yk35 / poly2tri

Automatically exported from code.google.com/p/poly2tri

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Polygon with hole

GoogleCodeExporter opened this issue · comments

What steps will reproduce the problem?
Using this polygon as input:
82 87
74 88
74 96
84 96
84 91

84 91
82 95
77 94
79 89
(Second list is hole)

This is a valid polygon:

    Polygon rings must close
    Rings that define holes should be inside rings that define exterior boundaries
    Rings must not self-intersect—they may neither touch nor cross one another
    Rings must not touch other rings except at a point


What is the expected output? What do you see instead?

Expect to have 7 triangles.

Got 13 triangles. The output mesh contains the tail and head points of Sweep 
line algorithm.

What version of the product are you using? On what operating system?

Last version of poly2tri (rev b85d2568420a )


This input polygon is not supported by poly2tri.js

The fix is relatively simple. Just ignore triangles that contains the point 
DTSweepContext._tail or DTSweepContext._head .

Original issue reported on code.google.com by nico.de...@gmail.com on 20 Apr 2015 at 9:17

Note, this is a bug on java version of Poly2Tri. This version does not throw 
errors.

Original comment by nico.de...@gmail.com on 20 Apr 2015 at 9:21

duplicate sorry. There was an error in the first publishing.

Original comment by nico.de...@gmail.com on 20 Apr 2015 at 11:01

The thing is that this isn't a strictly simple polygon since both outer ring 
and the hole shares a vertex. So this is a weakly simple polygon.

As long as this shared vertex is a single object the triangulator should have 
no problems triangulating. If your polygon contain multiple shared vertexes 
such that all the internal triangles can't form a single edge connected graph 
the cleanup of external triangles will fail.

So poly2tri assumes that vertexes shared by hole and outer ring isn't shared, 
but can handle it if you make sure they are the same object. Poly2tri's simple 
way of cleaning away outside triangles also assumes that all inner triangles 
are connected by atleast one edge so that they form a single graph.

Original comment by thahlen@gmail.com on 20 Apr 2015 at 12:30

  • Changed state: WontFix
Do you mean that equality check in done with == instead of Object.equals ?

Original comment by nico.de...@gmail.com on 20 Apr 2015 at 12:39

yes

Original comment by thahlen@gmail.com on 20 Apr 2015 at 12:41

Can I replace == by .equals or there is a reason ?

Original comment by nico.de...@gmail.com on 20 Apr 2015 at 12:46

Since the points will contain data to build a connected graph during the 
triangulation. Any input case where two different objects can have the exact 
same coordinate the result of the triangulation is somewhat undefined. poly2tri 
was written to assume that polygon is strictly simple and that there aren't two 
objects with exactly same coordinate supplied in the input.

Original comment by thahlen@gmail.com on 20 Apr 2015 at 12:48

If you aren't sure all input polygons is strictly simple the solution would be 
to hash the points of the outer ring. Then check if the hole points .equals any 
of the outer points and replace duplicate points them with the already existing 
object.

Original comment by thahlen@gmail.com on 20 Apr 2015 at 12:54

Ok. Then this could be a preprocessing step. Its true that == test is way more 
faster than Object.equals.

I will change the code to check for duplicates into the method 
Triangulatable.prepareTriangulation . Does its seems to be clean for you ?

Thanks,

Original comment by nico.de...@gmail.com on 20 Apr 2015 at 1:01

I think I would do these test in the "external code" before adding the holes to 
the poly2tri lib instead of altering the code in poly2tri.

It is a redundant test in every case when you know your polygons are strictly 
simple, thats why I think this test should be done before adding the input to 
the Polygon class.

But in this case you are changing your fork of the poly2tri lib, just for your 
own usage with orbisgis. So where you add this test is up to you. 

My best suggestion in this case would probably be to use this hash in Polygon 
class and do the test every time you add a hole/steiner point. 

Original comment by thahlen@gmail.com on 20 Apr 2015 at 1:47