annotate main/plot/ginput.cc @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 * Get graphical coordinates from screen
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 * This contains bits of code hacked from the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 * X Consortium and from Octave. Please see the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 * appropriate licences. The rest is mine, and
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 * you can do what you want with that part.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 * Andy Adler <adlera@ncf.ca> (C) 1997
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 * Compile like this
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 * mkoctfile -L/usr/X11R6/lib -lX11 -I/usr/X11R6/include/ ginput.cc
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 *
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 * Please excuse the ugly code. I wrote while I was learning C.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 #include <octave/config.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 #include <iostream.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 #include <octave/pager.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 #include <octave/defun-dld.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23 #include <octave/error.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 #include <octave/help.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 #include <octave/symtab.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26 #include <octave/oct-obj.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 #include <octave/utils.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 #include <X11/Xlib.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 #include <X11/cursorfont.h>
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 #define maxpoints 100
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 DEFUN_DLD (ginput, args, nargout ,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 "[...] = ginput (...)\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 GINPUT: gets points mouse clicks on the screen\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39 [x,y]= ginput(axis)\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 x -> x coordinates of the points\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 y -> y coordinates of the points\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 axis -> if specified then the first 2 (or 4) clicks\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 must be on the appropriate axes. x and y (or just x\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 if only 2 points specified ) will then be normalised.\n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47 for example: x=ginput([1 10]) \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 the first two clicks should correspond to x=1 and x=10 \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 subsequent clicks will then be normalized to graph units. \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50 \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 for example: [x,y]=ginput; \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 gives x and y in screen pixel units (upper left = 0,0 ) \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 \n\
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 select points with button #1. Buttons 2 and 3 quit. ")
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55 {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 XEvent event;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 XButtonEvent *e;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 Cursor cursor;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 Display *dpy;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 int xc[maxpoints],yc[maxpoints],nc=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 octave_value_list retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63 int nargin = args.length();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 if (nargin > 1) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 print_usage ("ginput");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 return retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 else if (nargin == 1) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 Matrix axis= args(0).matrix_value();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 nc= args(0).columns();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 if (nc==2 || nc==4)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 octave_stdout << "First click on x-axis points " <<
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 axis(0,0) << ", " << axis(0,1) <<"\n";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 if (nc==4)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 octave_stdout << "Then click on y-axis points " <<
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79 axis(0,2) << ", " << axis(0,3) <<"\n";
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 flush_octave_stdout ();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 char *displayname = NULL;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84 dpy = XOpenDisplay (displayname);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 if (!dpy) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 fprintf(stderr,"GINPUT: unable to open display %s\n",
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 XDisplayName(displayname));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 exit (1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 cursor = XCreateFontCursor(dpy, XC_crosshair);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 /* Grab the pointer using target cursor, letting it room all over */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95 Window root = RootWindow(dpy,0);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 int done = XGrabPointer(dpy, root, False, ButtonPressMask,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 GrabModeSync, GrabModeAsync, root, cursor, CurrentTime);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 if (done != GrabSuccess) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99 fprintf(stderr,"GINPUT: Can't grab the mouse.\n");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 exit(1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101 };
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
103 int m=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
104 do {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
105 XAllowEvents(dpy, SyncPointer, CurrentTime);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
106 XWindowEvent(dpy, root, ButtonPressMask, &event);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
107
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
108 e = (XButtonEvent *) &event;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
109
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
110 xc[m]= e->x_root;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
111 yc[m]= e->y_root;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
112
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
113 /*
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
114 printf("%d,%d,(%d,%d),B=%u,t=%lu\n",
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
115 e->x, e->y, e->x_root, e->y_root, e->button, e->time);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
116 */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
117 } while (e->button == 1 && ++m < maxpoints);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
118
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
119 if (m < nc) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
120 fprintf(stderr,"GINPUT: Not enough points selected.\n");
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
121 exit(1);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
122 };
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
123
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
124 double xb=0, xm=1, yb=0, ym=1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
125 if (nc==2 || nc==4) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
126 Matrix axis= args(0).matrix_value();
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
127
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
128 xm= (axis(0,0)-axis(0,1)) / (xc[0]-xc[1]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
129 xb= (xc[1]*axis(0,0)-xc[0]*axis(0,1)) / (xc[1]-xc[0]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
130
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
131 // octave_stdout << "xm=" << xm << " xb=" << xb ;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
132
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
133 if (nc==4) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
134 ym= (axis(0,2)-axis(0,3)) / (yc[2]-yc[3]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
135 yb= (yc[3]*axis(0,2)-yc[2]*axis(0,3)) / (yc[3]-yc[2]);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
136 };
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
137 };
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
138
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
139 ColumnVector x(m-nc),y(m-nc);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
140 for(int i=nc; i<m; i++) {
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
141 x(i-nc)= (double) xc[i]*xm + xb;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
142 y(i-nc)= (double) yc[i]*ym + yb;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
143 };
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
144
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
145 XUngrabPointer(dpy, CurrentTime); /* Done with pointer */
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
146 XCloseDisplay (dpy);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
147
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
148 retval(0) = x;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
149 if (nargout == 2)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
150 retval(1) = y;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
151
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
152 return retval;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
153 }
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
154