IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 40018


Ignore:
Timestamp:
Apr 27, 2017, 2:45:53 AM (9 years ago)
Author:
eugene
Message:

small change on ticks to keep sensible for large axis-ratio plots; fix filled circle in X (fill has 1 pix smaller radius)

Location:
trunk/Ohana/src/kapa2/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/kapa2/src/DrawFrame.c

    r39926 r40018  
    55int DrawFrame (KapaGraphWidget *graph) {
    66 
    7   int i, j, Nticks, P, doffset;
     7  int i, j, Nticks, Px, Py, doffset;
    88  double fx, fy, dfx, dfy, dx = 0, dy = 0, lweight;
    99  Graphic *graphic;
     
    1313  graphic = GetGraphic();
    1414
    15   P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
     15  // P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
     16  // P ~ 1.25*(x-axis length)
     17  Px = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
     18  Py = 0.5 * (1 + 0.25*graph[0].axis[1].lweight) * (hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy) + hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy));
     19  int P = MIN (Px, Py);
    1620
    1721  /* each axis is drawn independently, but ticks and labels are placed according to perpendicular distance. */
     
    9296  double x, y, dx, dy;
    9397  int pos, dir, fontsize;
    94   double size, n, pad;
     98  double size, pad;
    9599  char string[64];
    96100
     
    108112
    109113  if (tick->IsMajor) {
    110     size = MAX (0.02, 7.0 / P);
     114    size = MIN (0.50*P, MAX (0.030 * P, 10.0));
    111115  } else {
    112     size = MAX (0.01, 4.0 / P);
    113   }
    114  
    115   n = P / hypot(dfx, dfy);
     116    size = MIN (0.25*P, MAX (0.015 * P, 5.0));
     117  }
     118  dir = ((naxis == 0) || (naxis == 3)) ? -1 : +1;
     119
    116120  x = fx + (value-min)*dfx/(max - min);
    117121  y = fy + (value-min)*dfy/(max - min);
    118122
    119123  if ((naxis == 0) || (naxis == 2)) {
    120     x = MIN(MAX(x, fx),fx+dfx);
     124    dx = 0;
     125    dy = dir*size;
     126    x  = MIN(MAX(x,    fx), fx+dfx);
    121127  }
    122128  if ((naxis == 1) || (naxis == 3)) {
    123     y = MAX(MIN(y, fy),fy+dfy);
    124   }
    125 
    126   dir = ((naxis == 0) || (naxis == 1)) ? -1 : +1;
    127   dx = dir*size*dfy*n; 
    128   dy = dir*size*dfx*n;
    129  
     129    dx = dir*size;
     130    dy = 0;
     131    y  = MAX(MIN(y,    fy), fy+dfy);
     132  }
     133
    130134  DrawLine (x, y, dx, dy);
    131135
     
    153157  }
    154158}
     159
     160# if (0)
     161void DrawTick (Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis) {
     162 
     163  double x, y, dx, dy;
     164  int pos, dir, fontsize;
     165  double size, n, pad;
     166  char string[64];
     167
     168  double fx  = axis->fx;
     169  double fy  = axis->fy;
     170  double dfx = axis->dfx;
     171  double dfy = axis->dfy;
     172
     173  double min = axis->min;
     174  double max = axis->max;
     175
     176  double value = tick->value;
     177
     178  pos = size = 0;
     179
     180  // size = 4 / P
     181  // n = P / dfx
     182  // dy = (4/P)*(P/dfx)*dfx = (0.01 * P) or 4
     183
     184  // size = 0.01
     185  // n = P / dfx
     186  // dy - 0.01 * (P / dfx) * dfx = 0.01*P
     187
     188  // n ~ 1.25 * x-axis / current-axis
     189  // n = P / hypot(dfx, dfy);
     190  n = P / hypot(dfx, dfy);
     191
     192  if (tick->IsMajor) {
     193    // size = MAX (0.02, 7.0 / P);
     194    size = MIN (0.50*P, MAX (0.030 * P, 10.0));
     195  } else {
     196    // size = MAX (0.01, 4.0 / P);
     197    size = MIN (0.25*P, MAX (0.015 * P, 5.0));
     198  }
     199 
     200  dir = ((naxis == 0) || (naxis == 3)) ? -1 : +1;
     201
     202  // fdir ~ 1.25 * (4,7) / current-axis
     203
     204  x = fx + (value-min)*dfx/(max - min);
     205  y = fy + (value-min)*dfy/(max - min);
     206
     207  double xs, xe, ys, ye;
     208  if ((naxis == 0) || (naxis == 2)) {
     209    dx = 0;
     210    dy = dir*size;
     211    xs = MIN(MAX(x,    fx), fx+dfx);
     212    xe = xs;
     213    ys = y;
     214    ye = y+dy;
     215  }
     216  if ((naxis == 1) || (naxis == 3)) {
     217    dx = dir*size;
     218    dy = 0;
     219    xs = x;
     220    xe = x+dx;
     221    ys = MAX(MIN(y,    fy), fy+dfy);
     222    ye = ys;
     223  }
     224
     225  double dxs = xe - xs;
     226  double dys = ye - ys;
     227 
     228  // dx ~ (4,7)*x-axis
     229  // dx = dir*size*dfy*n;       
     230  // dy = dir*size*dfx*n;
     231
     232  fprintf (stderr, "axis: %d %f : %f %d %f : %f %f : %f %f : %f %f\n",
     233           naxis, value, n, P, size, dfx, dfy, dx, dy, dxs, dys);
     234
     235  DrawLine (xs, ys, dxs, dys);
     236
     237  if (tick->IsLabel) {
     238    int xt, yt;
     239
     240    // char *fontname is returned by GetRotFont, but not used here
     241    GetRotFont (&fontsize);
     242   
     243    pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : fontsize + 4.0;
     244    // pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : 0.8*fontsize + 1.0;
     245   
     246    /* temporarily assume rectilinear axes */
     247    if (naxis == 0) { dx = 0; dy = +1.0*pad; pos = 1; } // center, down justified
     248    if (naxis == 2) { dx = 0; dy = -1.0*pad; pos = 7; } // center, up justified
     249
     250    if (naxis == 1) { dy = 0; dx = -0.5*pad; pos = 3; } // left, center justified
     251    if (naxis == 3) { dy = 0; dx = +0.5*pad; pos = 5; } // right, center justified
     252
     253    xt = fx + (value-min)*dfx/(max - min) + dx;
     254    yt = fy + (value-min)*dfy/(max - min) + dy;
     255
     256    PrintTick (string, value, min, max, tick->nsignif);
     257    DrawRotText (xt, yt, string, pos, 0.0);
     258  }
     259}
     260# endif
    155261
    156262// do I really want this?  allow an override?
  • trunk/Ohana/src/kapa2/src/DrawObjects.c

    r39926 r40018  
    66// # define FillRectangle(X1,Y1,X2,Y2) ;
    77# define DrawCircle(X,Y,R) (XDrawArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R), abs(2*R), 0, 23040))
    8 # define FillCircle(X,Y,R) (XFillArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R+1), abs(2*R+1), 0, 23040))
     8# define FillCircle(X,Y,R) (XFillArc (graphic->display, graphic->window, graphic->gc, (int)(X-R), (int)(Y-R), abs(2*R), abs(2*R), 0, 23040))
    99
    1010# define XCENTER 0.0
    1111# define YCENTER 0.0
    12 # define CAPSTYLE CapButt
     12/* # define CAPSTYLE CapButt */
     13# define CAPSTYLE CapNotLast
    1314# define JOINSTYLE JoinMiter
    1415
     
    637638          }
    638639          D = scaleSize ? dz*z[i] : ds;
     640          DrawCircle (sx, sy, D);
    639641          FillCircle (sx, sy, D);
    640           DrawCircle (sx, sy, D);
    641642        }
    642643      }
  • trunk/Ohana/src/kapa2/src/MakeGC.c

    r13320 r40018  
    88  gcvalues.foreground = graphic->fore;
    99  gcvalues.background = graphic->back;
     10  gcvalues.arc_mode   = ArcPieSlice; // ArcChord;
     11
     12
    1013  graphic->gc = XCreateGC (graphic->display, graphic->window,
    11                              GCForeground | GCBackground, &gcvalues);
     14                             GCForeground | GCBackground | GCArcMode, &gcvalues);
    1215  if (graphic->gc == 0)
    1316    QuitX (graphic->display, "Error in creating a Graphics Context");
  • trunk/Ohana/src/kapa2/src/PSFrame.c

    r39926 r40018  
    5454}
    5555
     56void PSTick (Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis, FILE *f) {
     57 
     58  double x, y, dx, dy;
     59  int pos, dir, fontsize;
     60  double size, pad;
     61  char string[64];
     62
     63  double fx  = axis->fx;
     64  double fy  = graphic->dy - axis->fy;
     65  double dfx = axis->dfx;
     66  double dfy = -axis->dfy;
     67
     68  double min = axis->min;
     69  double max = axis->max;
     70
     71  double value = tick->value;
     72
     73  pos = size = 0;
     74
     75  if (tick->IsMajor) {
     76    size = MIN (0.50*P, MAX (0.030 * P, 10.0));
     77  } else {
     78    size = MIN (0.25*P, MAX (0.015 * P, 5.0));
     79  }
     80  dir = ((naxis == 2) || (naxis == 3)) ? -1 : +1;
     81
     82  x = fx + (value-min)*dfx/(max - min);
     83  y = fy + (value-min)*dfy/(max - min);
     84
     85  if ((naxis == 0) || (naxis == 2)) {
     86    dx = 0;
     87    dy = dir*size;
     88    x = MIN(MAX(x, fx),fx+dfx);
     89  }
     90  if ((naxis == 1) || (naxis == 3)) {
     91    dx = dir*size;
     92    dy = 0;
     93    y = MIN(MAX(y, fy),fy+dfy);
     94  }
     95 
     96  DrawLine (x, y, dx, dy);
     97
     98  if (tick->IsLabel) {
     99    int xt, yt;
     100
     101    // char *fontname is returned by not needed
     102    GetRotFont (&fontsize);
     103
     104    pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : 0.8*fontsize + 1.0;
     105   
     106    /* temporarily assume rectilinear axes */
     107    if (naxis == 0) { dx = 0; dy = -pad; pos = 1; }
     108    if (naxis == 2) { dx = 0; dy = +pad; pos = 7; }
     109
     110    if (naxis == 1) { dy = 0; dx = -pad; pos = 3; }
     111    if (naxis == 3) { dy = 0; dx = +pad; pos = 5; }
     112
     113    xt = fx + (value-min)*dfx/(max - min) + dx;
     114    yt = fy + (value-min)*dfy/(max - min) + dy;
     115
     116    PrintTick (string, value, min, max, tick->nsignif);
     117    PSRotText (f, xt, yt, string, pos, 0.0);
     118  }
     119}
     120
     121  /*
     122  dx = size*dfy*n;     
     123  dy = size*dfx*n;
     124  DrawLine (x, y, dx, dy);
     125 
     126  dx = -size*dfy*n;     
     127  dy = -size*dfx*n;
     128  DrawLine (x, y, dx, dy);
     129  */
     130 
     131# if (0)
    56132void PSTick (Graphic *graphic, Axis *axis, int P, TickMarkData *tick, int naxis, FILE *f) {
    57133 
     
    118194  }
    119195}
     196# endif
    120197
    121   /*
    122   dx = size*dfy*n;     
    123   dy = size*dfx*n;
    124   DrawLine (x, y, dx, dy);
    125  
    126   dx = -size*dfy*n;     
    127   dy = -size*dfx*n;
    128   DrawLine (x, y, dx, dy);
    129   */
    130  
  • trunk/Ohana/src/kapa2/src/bDrawFrame.c

    r39926 r40018  
    44int bDrawFrame (bDrawBuffer *buffer, KapaGraphWidget *graph) {
    55 
    6   int i, j, Nticks, P, doffset;
     6  int i, j, Nticks, doffset;
    77  double fx, fy, dfx, dfy, lweight, dx = 0, dy = 0;
    88  // Graphic graphic; is not needed
     
    1212  // don't need graphic, unlink DrawFrame
    1313
    14   P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
     14  // P = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
     15  int Px = 0.5 * (1 + 0.25*graph[0].axis[0].lweight) * (hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy) + hypot (graph[0].axis[0].dfx, graph[0].axis[0].dfy));
     16  int Py = 0.5 * (1 + 0.25*graph[0].axis[1].lweight) * (hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy) + hypot (graph[0].axis[1].dfx, graph[0].axis[1].dfy));
     17  int P = MIN (Px, Py);
    1518
    1619  /* each axis is drawn independently */
     
    5861}
    5962
     63void bDrawTick (bDrawBuffer *buffer, Axis *axis, int P, TickMarkData *tick, int naxis) {
     64 
     65  double x, y, dx, dy;
     66  int pos, dir, fontsize;
     67  double size, pad;
     68  char string[64];
     69
     70  double fx  = axis->fx;
     71  double fy  = axis->fy;
     72  double dfx = axis->dfx;
     73  double dfy = axis->dfy;
     74
     75  double min = axis->min;
     76  double max = axis->max;
     77
     78  double value = tick->value;
     79
     80  pos = size = 0;
     81
     82  if (tick->IsMajor) {
     83    size = MIN (0.50*P, MAX (0.030 * P, 10.0));
     84  } else {
     85    size = MIN (0.25*P, MAX (0.015 * P, 5.0));
     86  }
     87  dir = ((naxis == 0) || (naxis == 3)) ? -1 : +1;
     88 
     89  x = fx + (value-min)*dfx/(max - min);
     90  y = fy + (value-min)*dfy/(max - min);
     91
     92  if ((naxis == 0) || (naxis == 2)) {
     93    dx = 0;
     94    dy = dir*size;
     95    x = MIN(MAX(x, fx),fx+dfx);
     96  }
     97  if ((naxis == 1) || (naxis == 3)) {
     98    dx = dir*size;
     99    dy = 0;
     100    y = MAX(MIN(y, fy),fy+dfy);
     101  }
     102 
     103  bDrawLine (buffer, x, y, x+dx, y+dy);
     104
     105  if (tick->IsLabel) {
     106    int xt, yt;
     107
     108    // char *fontname is returned but ignored
     109    GetRotFont (&fontsize);
     110
     111    pad = !isnan(axis->ticktextPad) ? axis->ticktextPad*fontsize : 0.8*fontsize + 1.0;
     112   
     113    /* temporarily assume rectilinear axes */
     114    if (naxis == 0) { dx = 0; dy = +pad; pos = 1; }
     115    if (naxis == 2) { dx = 0; dy = -pad; pos = 7; }
     116
     117    if (naxis == 1) { dy = 0; dx = -pad; pos = 3; }
     118    if (naxis == 3) { dy = 0; dx = +pad; pos = 5; }
     119
     120    xt = fx + (value-min)*dfx/(max - min) + dx;
     121    yt = fy + (value-min)*dfy/(max - min) + dy;
     122
     123    PrintTick (string, value, min, max, tick->nsignif);
     124    bDrawRotText (buffer, xt, yt, string, pos, 0.0);
     125  }
     126}
     127
     128# if (0)
    60129void bDrawTick (bDrawBuffer *buffer, Axis *axis, int P, TickMarkData *tick, int naxis) {
    61130 
     
    122191  }
    123192}
     193
     194# endif
Note: See TracChangeset for help on using the changeset viewer.