diff main/plot/gzoom.cc @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children 276d676c91da
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/plot/gzoom.cc	Wed Oct 10 19:54:49 2001 +0000
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2001 Laurent Mazet
+ * This program is free software and may be used for any purpose.  This
+ * copyright notice must be maintained.  Paul Kienzle is not responsible
+ * for the consequences of using this software.
+ */
+
+/*
+ * Laurent Mazet <mazet@crm.mot.com> (C) 2001
+ *
+ * - 10/4/01 -
+ * Initial release
+ */
+
+
+#include <string>
+
+#include <octave/oct.h>
+#include <octave/toplev.h>
+#include <octave/parse.h>
+
+#include "graphics.h"
+
+DEFUN_DLD (gzoom, args, ,
+	   "usage: gzoom()\n"
+	   "\n"
+	   "Controls are:\n"
+	   " * Use left button to zoom on an area.\n"
+	   " * Use right button to zoom back on a point.\n"
+	   " * Use middle button to quit and keep current axis settings.\n"
+	   " * Press any key to quit and recover old axis setting") {
+
+  /* Ask gnuplot for current figure */
+  string name = find_gnuplot_window ("gzoom");
+  if (name.length() == 0)
+    return octave_value();
+
+  /* Ask gnuplot for axis limits */
+  ColumnVector initial_axis = guess_axis ("gzoom");
+  if (initial_axis.length() == 0)
+    return octave_value();
+  ColumnVector axis = initial_axis;
+
+  octave_value_list axis_args;
+  axis_args(0) = initial_axis;
+  feval ("axis", axis_args, 0);
+  
+  octave_value_list replot_args;
+  replot_args(0) = "replot";
+  feval ("eval", replot_args, 0);
+  
+  /* Get window and initialize gwindow structure */ 
+  gwindow gw;
+  if (!init_gwindow (gw, name, "gzoom"))
+    return octave_value();
+
+  /* Warp to window */
+  warp_center (gw);
+
+  /* Guess border */
+  ColumnVector guess_axis = guess_border (gw);
+  
+  MArray<int> x(2);
+  MArray<int> y(2);
+  
+ /* Watch for key/button press (among others) */
+  while (1) {
+
+    /* Compute real coordonnates */
+    double xdiff = guess_axis(1) - guess_axis(0);
+    double xm = -(axis(0)-axis(1)) / xdiff;
+    double xb = (guess_axis(1)*axis(0)-guess_axis(0)*axis(1)) / xdiff;
+    double ydiff = guess_axis(2) - guess_axis(3);
+    double ym = -(axis(2)-axis(3)) / ydiff;
+    double yb = (guess_axis(2)*axis(2)-guess_axis(3)*axis(3)) / ydiff;
+    
+    switch (get_area_point (gw, x, y)) {
+    case 0:
+      /* Key pressed */
+      axis_args(0) = initial_axis;
+      feval ("axis", axis_args, 0);
+      feval ("eval", replot_args, 0);
+      close_gwindow (gw);
+      return octave_value();
+      break;
+
+    case 1:
+      /* Left button */
+
+      /* Choice axis */
+      axis(0) = ((x(0) > x(1)) ? x(1) : x(0))*xm + xb;
+      axis(1) = ((x(0) > x(1)) ? x(0) : x(1))*xm + xb;
+      axis(2) = ((y(0) < y(1)) ? y(1) : y(0))*ym + yb;
+      axis(3) = ((y(0) < y(1)) ? y(0) : y(1))*ym + yb;
+
+      /* Send gnuplot commands */
+      axis_args(0) = axis;
+      feval ("axis", axis_args, 0);
+      feval ("eval", replot_args, 0);
+      break;
+      
+    case 2:
+      /* Middle button */
+      close_gwindow (gw);
+      return octave_value();
+      break;
+
+    case 3:
+      /* Right button */
+
+      xdiff = axis(1)-axis(0);
+      ydiff = axis(3)-axis(2);
+
+      /* Choice axis */
+      axis(0) = x(0)*xm + xb - xdiff;
+      axis(1) = x(0)*xm + xb + xdiff;
+      axis(2) = y(0)*ym + yb - ydiff;
+      axis(3) = y(0)*ym + yb + ydiff;
+
+      /* Send gnuplot commands */
+      axis_args(0) = axis;
+      feval ("axis", axis_args, 0);
+      feval ("eval", replot_args, 0);
+      break;
+    }
+  }
+}