@@ -808,7 +808,7 @@ public static RectD GetBounds(PathD path) {
808808 result .bottom = pt .y ;
809809 }
810810 }
811- return result .left == Double .MAX_VALUE ? new RectD () : result ;
811+ return InternalClipper . IsAlmostZero ( result .left - Double .MAX_VALUE ) ? new RectD () : result ;
812812 }
813813
814814 public static RectD GetBounds (PathsD paths ) {
@@ -829,7 +829,7 @@ public static RectD GetBounds(PathsD paths) {
829829 }
830830 }
831831 }
832- return result .left == Double .MAX_VALUE ? new RectD () : result ;
832+ return InternalClipper . IsAlmostZero ( result .left - Double .MAX_VALUE ) ? new RectD () : result ;
833833 }
834834
835835 public static Path64 MakePath (int [] arr ) {
@@ -863,6 +863,36 @@ public static double Sqr(double value) {
863863 return value * value ;
864864 }
865865
866+ public static double Sqr (long value ) {
867+ return (double ) value * (double ) value ;
868+ }
869+
870+ public static double DistanceSqr (Point64 pt1 , Point64 pt2 ) {
871+ return Sqr (pt1 .x - pt2 .x ) + Sqr (pt1 .y - pt2 .y );
872+ }
873+
874+ public static Point64 MidPoint (Point64 pt1 , Point64 pt2 ) {
875+ return new Point64 ((pt1 .x + pt2 .x ) / 2 , (pt1 .y + pt2 .y ) / 2 );
876+ }
877+
878+ public static PointD MidPoint (PointD pt1 , PointD pt2 ) {
879+ return new PointD ((pt1 .x + pt2 .x ) / 2 , (pt1 .y + pt2 .y ) / 2 );
880+ }
881+
882+ public static void InflateRect (Rect64 rec , int dx , int dy ) {
883+ rec .left -= dx ;
884+ rec .right += dx ;
885+ rec .top -= dy ;
886+ rec .bottom += dy ;
887+ }
888+
889+ public static void InflateRect (RectD rec , double dx , double dy ) {
890+ rec .left -= dx ;
891+ rec .right += dx ;
892+ rec .top -= dy ;
893+ rec .bottom += dy ;
894+ }
895+
866896 public static boolean PointsNearEqual (PointD pt1 , PointD pt2 , double distanceSqrd ) {
867897 return Sqr (pt1 .x - pt2 .x ) + Sqr (pt1 .y - pt2 .y ) < distanceSqrd ;
868898 }
@@ -1366,10 +1396,10 @@ public static Path64 TrimCollinear(Path64 path, boolean isOpen) {
13661396 int len = path .size ();
13671397 int i = 0 ;
13681398 if (!isOpen ) {
1369- while (i < len - 1 && InternalClipper .CrossProduct (path .get (len - 1 ), path .get (i ), path .get (i + 1 )) == 0 ) {
1399+ while (i < len - 1 && InternalClipper .IsCollinear (path .get (len - 1 ), path .get (i ), path .get (i + 1 ))) {
13701400 i ++;
13711401 }
1372- while (i < len - 1 && InternalClipper .CrossProduct (path .get (len - 2 ), path .get (len - 1 ), path .get (i )) == 0 ) {
1402+ while (i < len - 1 && InternalClipper .IsCollinear (path .get (len - 2 ), path .get (len - 1 ), path .get (i ))) {
13731403 len --;
13741404 }
13751405 }
@@ -1385,7 +1415,7 @@ public static Path64 TrimCollinear(Path64 path, boolean isOpen) {
13851415 Point64 last = path .get (i );
13861416 result .add (last );
13871417 for (i ++; i < len - 1 ; i ++) {
1388- if (InternalClipper .CrossProduct (last , path .get (i ), path .get (i + 1 )) == 0 ) {
1418+ if (InternalClipper .IsCollinear (last , path .get (i ), path .get (i + 1 ))) {
13891419 continue ;
13901420 }
13911421 last = path .get (i );
@@ -1394,10 +1424,10 @@ public static Path64 TrimCollinear(Path64 path, boolean isOpen) {
13941424
13951425 if (isOpen ) {
13961426 result .add (path .get (len - 1 ));
1397- } else if (InternalClipper .CrossProduct (last , path .get (len - 1 ), result .get (0 )) != 0 ) {
1427+ } else if (! InternalClipper .IsCollinear (last , path .get (len - 1 ), result .get (0 ))) {
13981428 result .add (path .get (len - 1 ));
13991429 } else {
1400- while (result .size () > 2 && InternalClipper .CrossProduct (result .get (result .size () - 1 ), result .get (result .size () - 2 ), result .get (0 )) == 0 ) {
1430+ while (result .size () > 2 && InternalClipper .IsCollinear (result .get (result .size () - 1 ), result .get (result .size () - 2 ), result .get (0 ))) {
14011431 result .remove (result .size () - 1 );
14021432 }
14031433 if (result .size () < 3 ) {
0 commit comments