@@ -814,23 +814,26 @@ private static Node splitPolygon(final Node a, final Node b, boolean edgeFromPol
814814 * Determines whether a diagonal between two polygon nodes lies within a polygon interior. (This determines the validity of the ray.)
815815 **/
816816 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+ }
817826 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 ;
820828 }
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
830831 && area (a .previous .getX (), a .previous .getY (), a .getX (), a .getY (), b .getX (), b .getY ()) != 0
831832 && area (a .getX (), a .getY (), b .getX (), b .getY (), b .next .getX (), b .next .getY ()) != 0
832833 && 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 ;
834837 }
835838
836839 /** Determine whether the polygon defined between node start and node end is CW */
0 commit comments