IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

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)

File:
1 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?
Note: See TracChangeset for help on using the changeset viewer.