[gimp] app: add utility function gimp_transform_polygon_is_convex()



commit eb4f01039a4a9a746ccc39ca599418c90ff2a497
Author: Michael Natterer <mitch gimp org>
Date:   Sun Mar 27 22:04:33 2011 +0200

    app: add utility function gimp_transform_polygon_is_convex()
    
    and use it in GimpTransformTool and GimpCanvasTransformPreview.

 app/core/gimp-transform-utils.c          |   27 ++++++
 app/core/gimp-transform-utils.h          |  139 ++++++++++++++++--------------
 app/display/gimpcanvastransformpreview.c |   16 +---
 app/tools/gimptransformtool.c            |   21 +----
 4 files changed, 111 insertions(+), 92 deletions(-)
---
diff --git a/app/core/gimp-transform-utils.c b/app/core/gimp-transform-utils.c
index 89896f1..482cb6b 100644
--- a/app/core/gimp-transform-utils.c
+++ b/app/core/gimp-transform-utils.c
@@ -327,3 +327,30 @@ gimp_transform_matrix_perspective (GimpMatrix3 *matrix,
 
   gimp_matrix3_mult (&trafo, matrix);
 }
+
+gboolean
+gimp_transform_polygon_is_convex (gdouble x1,
+                                  gdouble y1,
+                                  gdouble x2,
+                                  gdouble y2,
+                                  gdouble x3,
+                                  gdouble y3,
+                                  gdouble x4,
+                                  gdouble y4)
+{
+  gdouble z1, z2, z3, z4;
+
+  /* We test if the transformed polygon is convex.  if z1 and z2 have
+   * the same sign as well as z3 and z4 the polygon is convex.
+   */
+  z1 = ((x2 - x1) * (y4 - y1) -
+        (x4 - x1) * (y2 - y1));
+  z2 = ((x4 - x1) * (y3 - y1) -
+        (x3 - x1) * (y4 - y1));
+  z3 = ((x4 - x2) * (y3 - y2) -
+        (x3 - x2) * (y4 - y2));
+  z4 = ((x3 - x2) * (y1 - y2) -
+        (x1 - x2) * (y3 - y2));
+
+  return (z1 * z2 > 0) && (z3 * z4 > 0);
+}
diff --git a/app/core/gimp-transform-utils.h b/app/core/gimp-transform-utils.h
index 532c525..098a490 100644
--- a/app/core/gimp-transform-utils.h
+++ b/app/core/gimp-transform-utils.h
@@ -19,72 +19,81 @@
 #define __GIMP_TRANSFORM_UTILS_H__
 
 
-void   gimp_transform_get_rotate_center    (gint                 x,
-                                            gint                 y,
-                                            gint                 width,
-                                            gint                 height,
-                                            gboolean             auto_center,
-                                            gdouble             *center_x,
-                                            gdouble             *center_y);
-void   gimp_transform_get_flip_axis        (gint                 x,
-                                            gint                 y,
-                                            gint                 width,
-                                            gint                 height,
-                                            GimpOrientationType  flip_type,
-                                            gboolean             auto_center,
-                                            gdouble             *axis);
+void       gimp_transform_get_rotate_center    (gint                 x,
+                                                gint                 y,
+                                                gint                 width,
+                                                gint                 height,
+                                                gboolean             auto_center,
+                                                gdouble             *center_x,
+                                                gdouble             *center_y);
+void       gimp_transform_get_flip_axis        (gint                 x,
+                                                gint                 y,
+                                                gint                 width,
+                                                gint                 height,
+                                                GimpOrientationType  flip_type,
+                                                gboolean             auto_center,
+                                                gdouble             *axis);
 
-void   gimp_transform_matrix_flip          (GimpMatrix3         *matrix,
-                                            GimpOrientationType  flip_type,
-                                            gdouble              axis);
-void   gimp_transform_matrix_flip_free     (GimpMatrix3         *matrix,
-                                            gdouble              x1,
-                                            gdouble              y1,
-                                            gdouble              x2,
-                                            gdouble              y2);
-void   gimp_transform_matrix_rotate        (GimpMatrix3         *matrix,
-                                            GimpRotationType     rotate_type,
-                                            gdouble              center_x,
-                                            gdouble              center_y);
-void   gimp_transform_matrix_rotate_rect   (GimpMatrix3         *matrix,
-                                            gint                 x,
-                                            gint                 y,
-                                            gint                 width,
-                                            gint                 height,
-                                            gdouble              angle);
-void   gimp_transform_matrix_rotate_center (GimpMatrix3         *matrix,
-                                            gdouble              center_x,
-                                            gdouble              center_y,
-                                            gdouble              angle);
-void   gimp_transform_matrix_scale         (GimpMatrix3         *matrix,
-                                            gint                 x,
-                                            gint                 y,
-                                            gint                 width,
-                                            gint                 height,
-                                            gdouble              t_x,
-                                            gdouble              t_y,
-                                            gdouble              t_width,
-                                            gdouble              t_height);
-void   gimp_transform_matrix_shear         (GimpMatrix3         *matrix,
-                                            gint                 x,
-                                            gint                 y,
-                                            gint                 width,
-                                            gint                 height,
-                                            GimpOrientationType  orientation,
-                                            gdouble              amount);
-void   gimp_transform_matrix_perspective   (GimpMatrix3         *matrix,
-                                            gint                 x,
-                                            gint                 y,
-                                            gint                 width,
-                                            gint                 height,
-                                            gdouble              t_x1,
-                                            gdouble              t_y1,
-                                            gdouble              t_x2,
-                                            gdouble              t_y2,
-                                            gdouble              t_x3,
-                                            gdouble              t_y3,
-                                            gdouble              t_x4,
-                                            gdouble              t_y4);
+void       gimp_transform_matrix_flip          (GimpMatrix3         *matrix,
+                                                GimpOrientationType  flip_type,
+                                                gdouble              axis);
+void       gimp_transform_matrix_flip_free     (GimpMatrix3         *matrix,
+                                                gdouble              x1,
+                                                gdouble              y1,
+                                                gdouble              x2,
+                                                gdouble              y2);
+void       gimp_transform_matrix_rotate        (GimpMatrix3         *matrix,
+                                                GimpRotationType     rotate_type,
+                                                gdouble              center_x,
+                                                gdouble              center_y);
+void       gimp_transform_matrix_rotate_rect   (GimpMatrix3         *matrix,
+                                                gint                 x,
+                                                gint                 y,
+                                                gint                 width,
+                                                gint                 height,
+                                                gdouble              angle);
+void       gimp_transform_matrix_rotate_center (GimpMatrix3         *matrix,
+                                                gdouble              center_x,
+                                                gdouble              center_y,
+                                                gdouble              angle);
+void       gimp_transform_matrix_scale         (GimpMatrix3         *matrix,
+                                                gint                 x,
+                                                gint                 y,
+                                                gint                 width,
+                                                gint                 height,
+                                                gdouble              t_x,
+                                                gdouble              t_y,
+                                                gdouble              t_width,
+                                                gdouble              t_height);
+void       gimp_transform_matrix_shear         (GimpMatrix3         *matrix,
+                                                gint                 x,
+                                                gint                 y,
+                                                gint                 width,
+                                                gint                 height,
+                                                GimpOrientationType  orientation,
+                                                gdouble              amount);
+void       gimp_transform_matrix_perspective   (GimpMatrix3         *matrix,
+                                                gint                 x,
+                                                gint                 y,
+                                                gint                 width,
+                                                gint                 height,
+                                                gdouble              t_x1,
+                                                gdouble              t_y1,
+                                                gdouble              t_x2,
+                                                gdouble              t_y2,
+                                                gdouble              t_x3,
+                                                gdouble              t_y3,
+                                                gdouble              t_x4,
+                                                gdouble              t_y4);
+
+gboolean   gimp_transform_polygon_is_convex    (gdouble              x1,
+                                                gdouble              y1,
+                                                gdouble              x2,
+                                                gdouble              y2,
+                                                gdouble              x3,
+                                                gdouble              y3,
+                                                gdouble              x4,
+                                                gdouble              y4);
 
 
 #endif  /*  __GIMP_TRANSFORM_UTILS_H__  */
diff --git a/app/display/gimpcanvastransformpreview.c b/app/display/gimpcanvastransformpreview.c
index 2a9d9d5..e5e9428 100644
--- a/app/display/gimpcanvastransformpreview.c
+++ b/app/display/gimpcanvastransformpreview.c
@@ -33,6 +33,7 @@
 
 #include "core/gimpchannel.h"
 #include "core/gimpimage.h"
+#include "core/gimp-transform-utils.h"
 
 #include "gimpcanvas.h"
 #include "gimpcanvastransformpreview.h"
@@ -354,7 +355,6 @@ gimp_canvas_transform_preview_transform (GimpCanvasItem   *item,
   gdouble                            tx2, ty2;
   gdouble                            tx3, ty3;
   gdouble                            tx4, ty4;
-  gdouble                            z1, z2, z3, z4;
 
   gimp_matrix3_transform_point (&private->transform,
                                 private->x1, private->y1,
@@ -369,16 +369,10 @@ gimp_canvas_transform_preview_transform (GimpCanvasItem   *item,
                                 private->x2, private->y2,
                                 &tx4, &ty4);
 
-  z1 = ((tx2 - tx1) * (ty4 - ty1) -
-        (tx4 - tx1) * (ty2 - ty1));
-  z2 = ((tx4 - tx1) * (ty3 - ty1) -
-        (tx3 - tx1) * (ty4 - ty1));
-  z3 = ((tx4 - tx2) * (ty3 - ty2) -
-        (tx3 - tx2) * (ty4 - ty2));
-  z4 = ((tx3 - tx2) * (ty1 - ty2) -
-        (tx1 - tx2) * (ty3 - ty2));
-
-  if (! ((z1 * z2 > 0) && (z3 * z4 > 0)))
+  if (! gimp_transform_polygon_is_convex (tx1, ty1,
+                                          tx2, ty2,
+                                          tx3, ty3,
+                                          tx4, ty4))
     return FALSE;
 
   if (extents)
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index ee7c393..a64202c 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -44,6 +44,7 @@
 #include "core/gimplayer.h"
 #include "core/gimpprogress.h"
 #include "core/gimptoolinfo.h"
+#include "core/gimp-transform-utils.h"
 
 #include "vectors/gimpvectors.h"
 #include "vectors/gimpstroke.h"
@@ -754,7 +755,6 @@ gimp_transform_tool_draw (GimpDrawTool *draw_tool)
   if (tr_tool->use_grid)
     {
       GimpCanvasGroup *stroke_group;
-      gdouble          z1, z2, z3, z4;
 
       if (gimp_transform_options_show_preview (options))
         {
@@ -777,23 +777,12 @@ gimp_transform_tool_draw (GimpDrawTool *draw_tool)
 
       gimp_draw_tool_push_group (draw_tool, stroke_group);
 
-      /* We test if the transformed polygon is convex.
-       * if z1 and z2 have the same sign as well as z3 and z4
-       * the polygon is convex.
-       */
-      z1 = ((tr_tool->tx2 - tr_tool->tx1) * (tr_tool->ty4 - tr_tool->ty1) -
-            (tr_tool->tx4 - tr_tool->tx1) * (tr_tool->ty2 - tr_tool->ty1));
-      z2 = ((tr_tool->tx4 - tr_tool->tx1) * (tr_tool->ty3 - tr_tool->ty1) -
-            (tr_tool->tx3 - tr_tool->tx1) * (tr_tool->ty4 - tr_tool->ty1));
-      z3 = ((tr_tool->tx4 - tr_tool->tx2) * (tr_tool->ty3 - tr_tool->ty2) -
-            (tr_tool->tx3 - tr_tool->tx2) * (tr_tool->ty4 - tr_tool->ty2));
-      z4 = ((tr_tool->tx3 - tr_tool->tx2) * (tr_tool->ty1 - tr_tool->ty2) -
-            (tr_tool->tx1 - tr_tool->tx2) * (tr_tool->ty3 - tr_tool->ty2));
-
       /*  draw the grid  */
       if (tr_tool->grid_coords &&
-          z1 * z2 > 0          &&
-          z3 * z4 > 0)
+          gimp_transform_polygon_is_convex (tr_tool->tx1, tr_tool->ty1,
+                                            tr_tool->tx2, tr_tool->ty2,
+                                            tr_tool->tx3, tr_tool->ty3,
+                                            tr_tool->tx4, tr_tool->ty4))
         {
           gint k = tr_tool->ngx + tr_tool->ngy;
           gint i, gci;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]