@@ -814,23 +814,26 @@ private static Node splitPolygon(final Node a, final Node b, boolean edgeFromPol
814
814
* Determines whether a diagonal between two polygon nodes lies within a polygon interior. (This determines the validity of the ray.)
815
815
**/
816
816
private static boolean isValidDiagonal (final Node a , final Node b ) {
817
+ if (a .next .idx == b .idx || a .previous .idx == b .idx
818
+ // check next edges are locally visible
819
+ || isLocallyInside (a .previous , b ) == false
820
+ || isLocallyInside (b .next , a ) == false
821
+ // check polygons are CCW in both sides
822
+ || isCWPolygon (a , b ) == false
823
+ || isCWPolygon (b , a ) == false ) {
824
+ return false ;
825
+ }
817
826
if (isVertexEquals (a , b )) {
818
- // If points are equal then use it if they are valid polygons
819
- return isCWPolygon (a , b );
827
+ return true ;
820
828
}
821
- return a .next .idx != b .idx
822
- && a .previous .idx != b .idx
823
- && isIntersectingPolygon (a , a .getX (), a .getY (), b .getX (), b .getY ()) == false
824
- && isLocallyInside (a , b )
825
- && isLocallyInside (b , a )
826
- && isLocallyInside (a .previous , b )
827
- && isLocallyInside (b .next , a )
828
- && middleInsert (a , a .getX (), a .getY (), b .getX (), b .getY ())
829
- // make sure we don't introduce collinear lines
829
+ return isLocallyInside (a , b ) && isLocallyInside (b , a ) && middleInsert (a , a .getX (), a .getY (), b .getX (), b .getY ())
830
+ // make sure we don't introduce collinear lines
830
831
&& area (a .previous .getX (), a .previous .getY (), a .getX (), a .getY (), b .getX (), b .getY ()) != 0
831
832
&& area (a .getX (), a .getY (), b .getX (), b .getY (), b .next .getX (), b .next .getY ()) != 0
832
833
&& area (a .next .getX (), a .next .getY (), a .getX (), a .getY (), b .getX (), b .getY ()) != 0
833
- && area (a .getX (), a .getY (), b .getX (), b .getY (), b .previous .getX (), b .previous .getY ()) != 0 ;
834
+ && area (a .getX (), a .getY (), b .getX (), b .getY (), b .previous .getX (), b .previous .getY ()) != 0
835
+ // this call is expensive so do it last
836
+ && isIntersectingPolygon (a , a .getX (), a .getY (), b .getX (), b .getY ()) == false ;
834
837
}
835
838
836
839
/** Determine whether the polygon defined between node start and node end is CW */
0 commit comments