int dpy_dbe;
XdbeBackBuffer w_bb;
XdbeSwapInfo bb_swap;
-GC gc_path, gc_velo, gc_cov, gc_fld1, gc_fld2;
+GC gc_path, gc_velo, gc_cov, gc_fld1, gc_fld2, gc_bot;
real_t xy_scale, cov_c[COV_N], cov_s[COV_N];
int x0x, y0y;
}
void init_gfx() {
- GC *p, *gc[] = {&gc_path, &gc_velo, &gc_cov, &gc_fld1, &gc_fld2};
- char *color[] = {"#FFFFFF", "#FF0000", "#FF00FF", "#00FFFF", "#0000FF"};
+ GC *p, *gc[] = {&gc_path, &gc_velo, &gc_cov, &gc_fld1, &gc_fld2, &gc_bot};
+ char *color[] = {"#FFFFFF", "#FF0000", "#FF00FF", "#00FFFF", "#0000FF",
+ "#777777"};
Colormap cmap;
XColor col;
int i;
cmap = DefaultColormap(dpy, 0);
- for (i = 0; i < 5; i++) {
+ for (i = 0; i < 6; i++) {
p = gc[i];
*p = XCreateGC(dpy, w, 0, NULL);
XParseColor(dpy, cmap, color[i], &col);
XDrawLine(dpy, dw, gc_velo, x2, y2, x2 + dx, y2 - dy);
}
+void plot_bot(plot_data_t *data) {
+ static real_t
+ b1[] = {0, 0, 258, 0, 258, 290, 0, 290, 0, 0},
+ b2[] = {35, 0, 35, 40, 115, 40, 115, 0, 35, 0},
+ b3[] = {35, 290, 35, 250, 115, 250, 115, 290, 35, 290};
+ static real_t *b[] = {b1, b2, b3};
+ //static int len[] = {length(b1), length(b2), length(b3)};
+ real_t cp, sp, x, y;
+ XPoint pt[5];
+ int i, j, k;
+
+ cp = cos(data->phi); sp = sin(data->phi);
+ for (i = 0; i < 3 /*length(len)*/; i++) {
+ for (j = 0, k = 0; j < 5/*len[i]/2*/; j++, k += 2) {
+ x = b[i][k] - 129.0; y = b[i][k+1] - 145.0;
+ pt[j].x = x2x(data->x1[0] + 0.001*(cp*x - sp*y));
+ pt[j].y = y2y(data->x2[0] + 0.001*(sp*x + cp*y));
+ }
+ XDrawLines(dpy, dw, gc_bot, pt, 5 /*len[i]/2*/, CoordModeOrigin);
+ }
+}
+
void xw_draw(plot_data_t *data) {
xw_flush_events();
draw_field(data);
plot_path(data);
+ plot_bot(data);
plot_cov(data);
plot_velo(data);
--- /dev/null
+#include <X11/Xlib.h>
+#include <X11/extensions/Xdbe.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include <stdio.h>
+
+#include "wt.h"
+
+#define WIDTH 700
+#define HEIGHT 500
+#define BORDER 20
+
+#define PT_SIZE 1
+#define VELO_SCALE 10.0
+#define VELO_DX -5
+#define VELO_DY -3
+#define COV_SCALE 1000.0
+#define COV_N 12
+
+Display *dpy;
+Window w, dw;
+int dpy_dbe;
+XdbeBackBuffer w_bb;
+XdbeSwapInfo bb_swap;
+GC gc_path, gc_velo, gc_cov, gc_fld1, gc_fld2;
+
+real_t xy_scale, cov_c[COV_N], cov_s[COV_N];
+int x0x, y0y;
+
+void set_coord() {
+ real_t tmp, min_x, max_x, min_y, max_y;
+ int i, m;
+
+ min_x = max_x = beacon_xy[0][0];
+ min_y = max_y = beacon_xy[0][1];
+ for (m = 0; m < 3; m++) {
+ if ((tmp = beacon_xy[m][0] - 0.04) < min_x) min_x = tmp;
+ if ((tmp = beacon_xy[m][0] + 0.04) > max_x) max_x = tmp;
+ if ((tmp = beacon_xy[m][1] - 0.04) < min_y) min_y = tmp;
+ if ((tmp = beacon_xy[m][1] + 0.04) > max_y) max_y = tmp;
+ }
+ xy_scale = (WIDTH - 2*BORDER)/(max_x - min_x);
+ if ((tmp = (HEIGHT - 2*BORDER)/(max_y - min_y)) < xy_scale)
+ xy_scale = tmp;
+ x0x = 0.5*(WIDTH - xy_scale*(min_x + max_x) + 1.0);
+ y0y = 0.5*(HEIGHT + xy_scale*(min_y + max_y) + 1.0);
+
+ for (i = 0; i < COV_N; i++) {
+ tmp = (2*M_PI*i)/(real_t)COV_N;
+ cov_c[i] = cos(tmp); cov_s[i] = sin(tmp);
+ }
+}
+
+void init_gfx() {
+ GC *p, *gc[] = {&gc_path, &gc_velo, &gc_cov, &gc_fld1, &gc_fld2};
+ char *color[] = {"#FFFFFF", "#FF0000", "#FF00FF", "#00FFFF", "#0000FF"};
+ Colormap cmap;
+ XColor col;
+ int i;
+
+ cmap = DefaultColormap(dpy, 0);
+
+ for (i = 0; i < 5; i++) {
+ p = gc[i];
+ *p = XCreateGC(dpy, w, 0, NULL);
+ XParseColor(dpy, cmap, color[i], &col);
+ XAllocColor(dpy, cmap, &col);
+ XSetForeground(dpy, *p, col.pixel);
+ XSetLineAttributes(dpy, *p, 0, LineSolid, CapButt, JoinBevel);
+ }
+}
+
+void xw_init() {
+ XEvent e;
+ int v_maj, v_min;
+
+ dpy = XOpenDisplay(NULL);
+ w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, WIDTH, HEIGHT, 0,
+ WhitePixel(dpy, 0), BlackPixel(dpy, 0));
+
+ if ((dpy_dbe = XdbeQueryExtension(dpy, &v_maj, &v_min))) {
+ w_bb = XdbeAllocateBackBufferName(dpy, w, XdbeBackground);
+ bb_swap.swap_window = w;
+ bb_swap.swap_action = XdbeBackground;
+ dw = w_bb;
+ }
+ else
+ dw = w;
+
+ init_gfx();
+ set_coord();
+
+ XSelectInput(dpy, w, ExposureMask);
+ XMapWindow(dpy, w);
+
+ for (;;) {
+ XNextEvent(dpy, &e);
+ if (e.type == Expose)
+ break;
+ }
+}
+
+void xw_flush_events() {
+ XEvent e;
+ while (XCheckWindowEvent(dpy, w, -1, &e));
+}
+
+inline int x2x(real_t x) {
+ real_t tmp = xy_scale*x + 0.5;
+ if (tmp < INT_MIN)
+ return INT_MIN;
+ if (tmp > INT_MAX)
+ return INT_MAX;
+ return x0x + (int)tmp;
+}
+
+inline int y2y(real_t y) {
+ real_t tmp = - xy_scale*y + 0.5;
+ if (tmp < INT_MIN)
+ return INT_MIN;
+ if (tmp > INT_MAX)
+ return INT_MAX;
+ return y0y + (int)tmp;
+}
+
+void draw_field(plot_data_t *data) {
+ XPoint pt[5];
+ int m, x, y, a = (int)(xy_scale*0.04 + 0.5), b = 1+a/2;
+
+ for (m = 0; m < 3; m++) {
+ x = x2x(beacon_xy[m][0]); y = y2y(beacon_xy[m][1]);
+ pt[0].x = x-a; pt[0].y = y-a;
+ pt[1].x = x-a; pt[1].y = y+a;
+ pt[2].x = x+a; pt[2].y = y+a;
+ pt[3].x = x+a; pt[3].y = y-a;
+ pt[4] = pt[0];
+ XDrawLines(dpy, dw, gc_fld1, pt, 5, CoordModeOrigin);
+
+ if (data->err[m])
+ XFillArc(dpy, dw, gc_velo, x-b, y-b, b, b, 0, 360*64);
+ }
+
+ /***/
+}
+
+void plot_path(plot_data_t *data) {
+ XPoint pt[MAX_POINTS];
+ int i;
+
+ for (i = 0; i < data->n; i++) {
+ pt[i].x = x2x(data->x1[i]);
+ pt[i].y = y2y(data->x2[i]);
+ }
+ XDrawLines(dpy, dw, gc_path, pt, data->n, CoordModeOrigin);
+ for (i = 0; i < data->n; i++)
+ XFillArc(dpy, dw, gc_path, pt[i].x - PT_SIZE, pt[i].y - PT_SIZE,
+ 2*PT_SIZE, 2*PT_SIZE, 0, 360*64);
+}
+
+void plot_cov(plot_data_t *data) {
+ XPoint pt[COV_N+1];
+ int i;
+
+ for (i = 0; i < COV_N; i++) {
+ pt[i].x = x2x(data->x1[0] +
+ COV_SCALE*(data->s11*cov_c[i] + data->s12*cov_s[i]));
+ pt[i].y = y2y(data->x2[0] +
+ COV_SCALE*(data->s12*cov_c[i] + data->s22*cov_s[i]));
+ }
+ pt[COV_N] = pt[0];
+ XDrawLines(dpy, dw, gc_cov, pt, COV_N+1, CoordModeOrigin);
+}
+
+void plot_velo(plot_data_t *data) {
+ int dx, dy,
+ x1 = x2x(data->x1[0]), y1 = y2y(data->x2[0]),
+ x2 = x1 + (int)(VELO_SCALE*xy_scale*data->v1 + 0.5),
+ y2 = y1 - (int)(VELO_SCALE*xy_scale*data->v2 + 0.5);
+ real_t c;
+
+ XDrawLine(dpy, dw, gc_velo, x1, y1, x2, y2);
+ c = 1.0/sqrt(sqr(data->v1) + sqr(data->v2) + 1e-12);
+ dx = (int)(c*(data->v1*VELO_DX - data->v2*VELO_DY) + 0.5);
+ dy = (int)(c*(data->v2*VELO_DX + data->v1*VELO_DY) + 0.5);
+ XDrawLine(dpy, dw, gc_velo, x2, y2, x2 + dx, y2 - dy);
+ dx = (int)(c*(data->v1*VELO_DX + data->v2*VELO_DY) + 0.5);
+ dy = (int)(c*(data->v2*VELO_DX - data->v1*VELO_DY) + 0.5);
+ XDrawLine(dpy, dw, gc_velo, x2, y2, x2 + dx, y2 - dy);
+}
+
+void xw_draw(plot_data_t *data) {
+ xw_flush_events();
+
+ if (!dpy_dbe)
+ XClearWindow(dpy, dw);
+
+ draw_field(data);
+ plot_path(data);
+ plot_cov(data);
+ plot_velo(data);
+
+ if (dpy_dbe)
+ XdbeSwapBuffers(dpy, &bb_swap, 1);
+
+ XFlush(dpy);
+}