home *** CD-ROM | disk | FTP | other *** search
/ ftp.eri.u-tokyo.ac.jp / 2014.03.ftp.eri.u-tokyo.ac.jp.zip / ftp.eri.u-tokyo.ac.jp / pub / seisv / src / 3.02 / magnit.c < prev    next >
C/C++ Source or Header  |  1999-11-10  |  11KB  |  349 lines

  1. /*  SeisView alone/client    Copyright (C) 1992,1998  K.Koketsu
  2.              <history>
  3.          98-11-03  Include panel definitions and remove CR.
  4.          98-10-06  Some global variables are replaced by constants.
  5.          98-10-01  _setbkcolor(0) in the initialization.
  6.          98-02-25  Abandon DOS, but take Windows 95/NT.
  7.          96-06-19  Support CISC NEWS and BSD/386.            */
  8.  
  9. #include <math.h>
  10. #include <stdio.h>
  11. #include "ctlname.h"
  12. #include "seis.h"
  13.  
  14. extern char     *iseg[10];            /* work segments for  selected events  */
  15. extern unsigned nseg;                 /* number of working segments          */
  16. extern int    itot;                              /* total # selected events  */
  17. extern short  isort;                             /* flag for sorting         */
  18. extern char   z$[11], w$[81];                     /* work string             */
  19. extern int    text_rows;
  20.  
  21. /***************************** variables for menu ****************************/
  22. extern char   em$[51];                            /* error message on menu   */
  23. extern char   mc$[42][9];                         /* field strings           */
  24. extern short  isr;                                /* initial cursor position */
  25.  
  26. /**************************** variables for retrieval ************************/
  27. extern char   f2$[6];
  28. extern char   dst$[9];
  29. extern char   so1$[4], som1$[3], so2$[4], som2$[3];
  30. extern char   sa1$[3], sam1$[3], sa2$[3], sam2$[3];
  31. extern char   sew1$[2], sew2$[2], sns1$[2], sns2$[2];
  32. extern char   y1$[5], m1$[3], d1$[3], h1$[3], n1$[3], s1$[5];
  33. extern char   y2$[5], m2$[3], d2$[3], h2$[3], n2$[3], s2$[5];
  34. extern char   dp1$[6], dp2$[6], mg1$[5], mg2$[5];
  35.  
  36. /**************************** variables for map ******************************/
  37. extern char   to1$[4], tom1$[3], to2$[4], tom2$[3];
  38. extern char   ta1$[3], tam1$[3], ta2$[3], tam2$[3];
  39. extern char   tew1$[2], tew2$[2], tns1$[2], tns2$[2];
  40.  
  41. double  rng[101];
  42. int     nn[101];
  43. /******************* MAGNITUDE (Draw magnitude-frequency diagram) ************/
  44. magnitude()
  45. {
  46.     int     i, j, k, rv2, jvk, jvl;
  47.     int     imn, ut, iun, vlen, ir, nnu;
  48.     double  f, rt1, rt2, tu, rm, uv, rva;
  49.  
  50.     if(itot == 0)  return( 3 );
  51.     isr=0;
  52.     strcpy(mc$[0], mg1$);  strcpy(mc$[1], mg2$);
  53.     strcpy(mc$[2],"1.00");
  54.     strcpy(mc$[3],"ACM");  strcpy(mc$[4],"LOG");
  55.     itoa(itot,mc$[5],10);
  56. j100:
  57.     if(panel(MAGNIT) == 3)  return( 0 );
  58.  
  59. /* rt2 = atof(mc$[1]) doesn't work properly on BSD/386 v1.0. 94-03-18 */
  60.     rt1 = atof(mc$[0]);  rt2 = atof(mc$[1]);
  61.     rv2 = atoi(mc$[5]);
  62.     tu  = atof( mc$[2] );
  63.     if(!strcmp(mc$[3],"ACM")) jvk = 2;  else jvk = 1;
  64.     if(!strcmp(mc$[4],"LOG")) jvl = 2;  else jvl = 1;
  65.  
  66.     clear( 0 );
  67.     _setbkcolor( 0 );
  68. j200: /* legend */
  69.     if(jvk == 2) {
  70.     i = 1;
  71.     strcpy(w$, "Accumulated Frequency");
  72.     strcpy(z$, "(ACM)");
  73.     }
  74.     else {
  75.     i = 4;
  76.     strcpy(w$, "Frequency");
  77.     strcpy(z$, "(FRQ)");
  78.     }
  79.     vprint(i, w$);
  80.     gprint(63, 1, "Magnitude", 4);
  81.     gprint(74, 1, z$, 4);
  82.     legend3();
  83.     _setcolor( 7 );
  84.                                        /* axes */
  85.     vaxis(jvl, 0, rv2, &ir, &uv, &rva);
  86.     vlen = (int)(YPixels - RowPixels*3.5);
  87.     gfprint(8, vlen+1, "unknown", 5);
  88.     _setcolor( 7 );
  89.  
  90.     imn = (int)((rt2-rt1) / tu);
  91.     if(imn*tu+rt1 < rt2)  imn++;
  92.     for(i=0; i<imn+1; i++)  rng[i] = rt1 + i*tu;
  93.     ut  = 449 / (imn+1);
  94.     iun = imn / 8;
  95.     for(i=0; i<imn; i++) {
  96.     if(iun<=1 || i%iun==0) {
  97.         f = rng[i];
  98.         ggcvt(f, 4, w$);  j = strlen(w$) - 1;
  99.         if(w$[j] == '.')  w$[j] = 0;
  100.         k = 41 + ut*(i+1);
  101.         gmoveto(k, vlen);  glineto(k, vlen+RowPixels/2);
  102.         j = _gettextextent( w$ ) / 2;
  103.         gfprint(k-j, vlen+RowPixels/2+2, w$, 7);
  104.     }
  105.     }
  106.  
  107.     nnu = 0;
  108.     for(i=0; i<imn; i++)  nn[i] = 0;
  109.     for(i=1; i<=itot; i++) {
  110.     rm = fnarg(i, 4);
  111.     if(rm < -9000.)  nnu++;
  112.     else {
  113.         if(jvk == 2) {
  114.         for(j=0; j<imn; j++)  if(rm >= rng[j])  nn[j]++;
  115.         }
  116.         else {
  117.         for(j=0; j<imn; j++)  if(rm>=rng[j] && rm<rng[j+1])  nn[j]++;
  118.         }
  119.     }
  120.     }
  121.  
  122.     _setcolor( 3 );
  123.     if(nnu > 0) {
  124.     if(jvk == 2)  nnu = nnu + nn[0];
  125.     if(jvl == 1)  k = (int)((nnu - rva) * uv);
  126.         else { f = nnu; k = (int)((log10(f)-rva) * uv); }
  127.     gbox(0, 41, ir-k, 41+ut, ir);
  128.     }
  129.     for(i=0; i<imn; i++) {
  130.     j = 41 + (i+1)*ut;
  131.         if(nn[i] > 0) {
  132.         if(jvl == 1)  k = (int)((nn[i] - rva) * uv);
  133.         else { f = nn[i]; k = (int)((log10(f)-rva) * uv); }
  134.         gbox(1, j, ir-k, j+ut, ir);
  135.     }
  136.     }
  137.  
  138.     _setcolor( 7 );
  139.     gmoveto(41, vlen);  glineto(490, vlen);
  140.  
  141.     k = fgkey(0, 1);
  142.     if(k==-1 || k==F1)  goto j200;
  143.     else if(k == F3)  return( 0 );
  144.     else  goto j100;
  145. }
  146.  
  147. void legend3()
  148. {
  149.     pfromto(2, 0);
  150.     gprint(63, 9, "depth", 2);
  151.     strcpy(w$, dp1$);  strcat(w$,"-");
  152.     strcat(w$, dp2$);  strcat(w$,"km");
  153.     gprint(66, 10, w$, 7);
  154. }
  155.  
  156. char  s[2] = { 0, 0 };
  157. void vprint(y, str)         /* Write the name of a vertical axis. */
  158. int   y;
  159. char *str;
  160. {
  161.     unsigned  i;
  162.  
  163.     for(i=0; i<strlen(str); i++) {
  164.     *s = str[i];
  165.     gprint(1, y+i, s, 2);
  166.     }
  167. }
  168.  
  169. /* Draw a vertical axis. */
  170. void vaxis(iv, sv1, sv2, ir, uv, rva)
  171. int    iv, sv1, sv2, *ir;
  172. double *uv, *rva;
  173. {
  174.     int     isu, rsa, rsb, ivn, ib, vlen, vorg;
  175.     int     i, j;
  176.     double  rvb, rvu, f;
  177.  
  178.     vlen = (int)(YPixels - RowPixels*3.5);
  179.     vorg = (int)(RowPixels * 2.5);
  180.     if(iv != 3) { gmoveto(40, 0); glineto(40, vlen); }
  181.  
  182.     scale(sv1, sv2, &rsa, &rsb, &isu);
  183.     if(iv == 2) {
  184.     f = rsa;
  185.     if(rsa <= 0) *rva = -1;  else *rva = log10( f );
  186.     f = rsb;  rvb = log10( f );
  187.     }
  188.     else {
  189.     rvu = isu;  *rva = rsa;  rvb = rsb;
  190.     ivn = (int)((rvb-*rva) / rvu);
  191.     }
  192.     switch( iv ) {
  193.     case  0: *ir = vlen - RowPixels;
  194.              *uv = (*ir-RowPixels)/(rvb-*rva); break;
  195.     case  3: *ir = vorg;
  196.              *uv = -(vlen-RowPixels)/(rvb-*rva); break;
  197.     default: *ir = vlen; *uv = (*ir-RowPixels)/(rvb-*rva); break;
  198.     }
  199.  
  200.     _setcolor( 7 );
  201.     if(iv == 2) {
  202.     for(i=0; i<5; i++) {
  203.         if(i == 0) j = 1;  else j = j * 10;
  204.         if(j > rsb) break;
  205.         ib = (int)(*ir - (i-*rva)*(*uv));
  206.         itoa(j,w$,10);
  207.         gfprint(38-_gettextextent(w$), ib-RowPixels, w$, 7);
  208.         gmoveto(32,ib);  glineto(40, ib);
  209.     }
  210.     f = sv2;
  211.     ib = *ir - (int)((log10(f)-*rva)*(*uv));
  212.     itoa(sv2, w$, 10);
  213.     gfprint(38-_gettextextent(w$), ib-RowPixels, w$, 3);
  214.     gmoveto(32,ib);  glineto(40, ib);
  215.     }
  216.     else {
  217.     for(i=0; i<=ivn; i++) {
  218.         ib = *ir - (int)(i*rvu*(*uv));
  219.         gmoveto(32,ib);  glineto(40, ib);
  220.         if(ivn<=8 || i%2==0) {
  221.         j = (int)(i*rvu + *rva);
  222.         itoa(j, w$, 10);
  223.         if(j != -1)
  224.           gfprint(38-_gettextextent(w$), ib-RowPixels, w$, 7);
  225.         }
  226.     }
  227.     _setcolor( 5 );
  228.     ib = (int)(*ir - (sv1-*rva)*(*uv));  gmoveto(32,ib);  glineto(40, ib);
  229.     ib = (int)(*ir - (sv2-*rva)*(*uv));  gmoveto(32,ib);  glineto(40, ib);
  230.     }
  231. }
  232.  
  233. void scale(rs1, rs2, rsa, rsb, isu)
  234. int   rs1, rs2, *rsa, *rsb, *isu;
  235. {
  236.     int  i, rj, ra;
  237.  
  238.     rj = rs2 - rs1;
  239.     if(rj < 15)  *isu = 1;
  240.     else if(rj <  150)  *isu =  10;
  241.     else if(rj < 1500)  *isu = 100;
  242.     else  *isu = 1000;
  243.  
  244.     *rsa = -1;  *rsb = -1;
  245.     for(i= -1; i<=1000; i++) {/* NEWS cc warns me of `i=-1' (Strange!) */
  246.     ra = i * (*isu);
  247.     if(rs1 == ra)  *rsa = ra;
  248.     if(*rsa==-1 && rs1>ra)  *rsa = ra;
  249.         if(rs2 <= ra) { *rsb = ra;  return; }
  250.     }
  251. }
  252.  
  253. /********* pyformto ************ (Gprint retrieval conditons.) */
  254. void pfromto(j, nplot)
  255. int  j, nplot;
  256. {
  257.     int  jj;
  258.  
  259.     jj = abs( j );
  260.     gprint(63, jj, "data ", 2);
  261.     if(nplot == 0)  sprintf(w$, "%d(%s)", itot, f2$);
  262.     else  sprintf(w$, "%d(%s)", nplot, f2$);
  263.     gprint(68, jj++, w$, 7);
  264.     gprint(63, jj, "from", 2);
  265.     strcpy(w$, y1$);  strcat(w$,"/");
  266.     strcat(w$, m1$);  strcat(w$,"/");
  267.     strcat(w$, d1$);
  268.     gprint(68, jj++, w$, 7);
  269.     strcpy(w$, h1$);  strcat(w$,":");
  270.     strcat(w$, n1$);  strcat(w$,":");
  271.     strcat(w$, s1$);
  272.     gprint(68, jj++, w$, 7);
  273.     gprint(63, jj, "to", 2);
  274.     strcpy(w$, y2$);  strcat(w$,"/");
  275.     strcat(w$, m2$);  strcat(w$,"/");
  276.     strcat(w$, d2$);
  277.     gprint(68, jj++, w$, 7);
  278.     strcpy(w$, h2$);  strcat(w$,":");
  279.     strcat(w$, n2$);  strcat(w$,":");
  280.     strcat(w$, s2$);
  281.     gprint(68, jj++, w$, 7);
  282.     if(j > 0) {
  283.     strcpy(w$, sa1$); strcat(w$," "); strcat(w$, sam1$); strcat(w$,sns1$);
  284.     strcat(w$,"- ");
  285.     strcat(w$, sa2$); strcat(w$," "); strcat(w$, sam2$); strcat(w$,sns2$);
  286.     }
  287.     else {
  288.     strcpy(w$, ta1$); strcat(w$," "); strcat(w$, tam1$); strcat(w$,tns1$);
  289.     strcat(w$,"- ");
  290.     strcat(w$, ta2$); strcat(w$," "); strcat(w$, tam2$); strcat(w$,tns2$);
  291.     }
  292.     gprint(64, jj++, w$, 7);
  293.     if(j > 0) {
  294.     strcpy(w$, so1$); strcat(w$," "); strcat(w$, som1$); strcat(w$,sew1$);
  295.     strcat(w$,"-");
  296.     strcat(w$, so2$); strcat(w$," "); strcat(w$, som2$); strcat(w$,sew2$);
  297.     }
  298.     else {
  299.     strcpy(w$, to1$); strcat(w$," "); strcat(w$, tom1$); strcat(w$,tew1$);
  300.     strcat(w$,"-");
  301.     strcat(w$, to2$); strcat(w$," "); strcat(w$, tom2$); strcat(w$,tew2$);
  302.     }
  303.     gprint(63, jj++, w$, 7);
  304. }
  305.  
  306. double fnarg(ng, ih)
  307. int  ng, ih;
  308. {
  309.     int      ipag, nn, mr;
  310.     char    *ig;
  311.     double   tg;
  312.  
  313.     ipag = (ng-1) / 4095;
  314.     ig   = iseg[ipag];
  315.     nn   = (ng-1-ipag*4095)*16 + 4;
  316.     switch( ih ) { /* Ignore seconds for sorting to TIME. */
  317.     case 0: tg = (peek(nn+4,ig)/60. + peek(nn+3,ig))/24. + peek(nn+2,ig);
  318.             return(fnyear(nn,ig)*12. + peek(nn+1,ig) + tg/31.);
  319.     case 1: return( bin2deg(nn+ 7,ig) );
  320.     case 2: return( bin2deg(nn+10,ig) );
  321.     case 3: if(fnyear(nn,ig) < 1885) return(-1.);
  322.             else return(qeek(nn+13,ig)/10.);
  323.     case 4: mr = peek(nn+15,ig);
  324.         if(mr == 0) return(-9999.);
  325.         else if(mr & 0x80) return(-(mr&0x7f)/10.);
  326.         else return(mr/10.);
  327.    }
  328. }
  329.  
  330. /************************ Panel Definitions **********************/
  331. char magnit_pan[] = "\
  332.     Request : MAGNITUDE                                                      \
  333.     Specify attributes of the coordinates in () as you like and press Enter. \
  334.           X-Axis :  Item       < MAGNITUDE >                                 \
  335.                     Scaling    < LINEAR >                                    \
  336.                     From       (      )                                      \
  337.                     To         (      )                                      \
  338.                     Tick Unit  (      )                                      \
  339.           Y-Axis :  Item       (     )  <--- FRQ/ACM(Frequency/Accumulated)  \
  340.                     Scaling    (     )  <--- LNR/LOG(Linear/Logarithmic)     \
  341.                     Maximum    (        )                                    \
  342.                                                                              \
  343. 33,  4,  4 \
  344. 33,  5,  4 \
  345. 33,  6,  4 \
  346. 33,  7,  3 \
  347. 33,  8,  3 \
  348. 33,  9,  6 ";
  349.