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 / mapsub.c < prev    next >
C/C++ Source or Header  |  1999-11-10  |  27KB  |  979 lines

  1. /*  SeisView alone/client    Copyright (C) 1992,1998  K.Koketsu
  2.          <history>
  3.          98-11-05  Remote auxiliary files.
  4.          98-11-03  Include panel definitions and remove CR.
  5.                    Fix bugs for a region traversing the date line.
  6.          98-10-06  Some global variables are replaced by constants.
  7.                    _setbkcolor(0) in the initialization.
  8.          98-02-25  Abandon DOS, but take Windows 95/NT.
  9.          93-06-02  version 2.00                    */
  10.  
  11. #include <math.h>
  12. #include "ctlname.h"
  13. #include "seis.h"
  14.  
  15. #ifdef WIN32
  16. extern HWND hwnd;
  17. #endif
  18. extern char     *iseg[10];            /* work segments for  selected events  */
  19. extern unsigned nseg;                 /* number of working segments          */
  20. extern short    nmax, nmax2;          /* maximum numbers of selected events  */
  21. extern int    itot;                               /* total # selected events */
  22. extern char   z$[11], w$[81];                     /* work string             */
  23.  
  24. /***************************** variables for menu ****************************/
  25. extern char   em$[51];                            /* error message on menu   */
  26. extern char   mc$[42][9];                         /* field strings           */
  27. extern short  isr;                                /* initial cursor position */
  28. extern short  kd[13];                             /* function key definitions*/
  29.  
  30. /******************** parameters for retrieving kernel **********************/
  31. extern long     lo1,lo2;            /* longitude            */
  32. extern short    lom1,lom2, la1,lam1,la2,lam2;    /* lonmin, lat,latmin        */
  33.  
  34. /**************************** variables for retrieval ************************/
  35. extern char   f2$[6];
  36. extern char   y1$[5], m1$[3], d1$[3], h1$[3], n1$[3], s1$[5];
  37. extern char   y2$[5], m2$[3], d2$[3], h2$[3], n2$[3], s2$[5];
  38. extern char   dst$[9];
  39. extern char   dp1$[6], dp2$[6], mg1$[5], mg2$[5];
  40. extern char   ynh$[2], ynm$[2];
  41.  
  42. /**************************** parameters for map ****************************/
  43. extern int    kx0, kx1, ky0, ky1;
  44. extern char   mps$[9], ync$[4];
  45. extern double yln[181], dln[180];    /* some values for map projection   */
  46. extern double a1,a2, b1,b2;            /* latitude,  longitude        */
  47. extern double c1, c2;
  48. extern double xm, ym, rrx, rry;
  49. extern int    cdp[7], icd[7];
  50. extern double cmg[8], rmg[8];
  51. extern int    ndp, nmg;
  52. extern short  wrap;                /* flag of wrap-around        */
  53.  
  54. /**************************** variables for TIME *****************************/
  55. extern int    kyy1, km1, kd1, kh1, kn1;
  56. extern int    kyy2, km2, kd2, kh2, kn2;
  57.  
  58. /**************************** variables for taxis ****************************/
  59. extern double st0, rt0, ut;
  60.  
  61. /********************* parameters for cross-section **************************/
  62. long   lo[5];
  63. short  lom[5], la[5], lam[5];
  64.  
  65. void   map_retrv(), press_prompt(), map_sub_prep(), legend2(), ital(),
  66.        otparm();
  67. int    project_area();
  68. double rtal(), delta();
  69.  
  70. /*** map subfunction-1 (find) ***/
  71. int map_find()
  72. {
  73.     int     ip, iq, ic, id, ie, icy, p[2], q[2];
  74.     int     i, itof, ly, printing;
  75.     double  f;
  76.  
  77.     ly = 21;
  78.     printing = 0;
  79.     clear( 0 );
  80. j10:
  81.     dmap(mps$, 0);
  82.     epicenters();
  83.     gviewport(0, 0, 639, YPixels-1);
  84.  
  85.     if(! printing) {
  86.     gprint(63, ly  , "Move the cross     ", 4);
  87.     gprint(63, ly+1, "to area center     ", 4);
  88.     press_prompt(1, ly+2);
  89.     ip = (kx1+kx0)/2;  iq = (ky1+ky0)/2;
  90.     gcursor(kx0, ky0, kx1, ky1, &ip, &iq, 1);
  91.     if(ip == -1)  goto j10;
  92.     
  93.     gprint(63, ly+1, "on circumference   ", 4);
  94.     ie = ip + 3;  id = (int)(iq - 2);
  95.     gcursor(kx0, ky0, kx1, ky1, &ie, &id, 0);
  96.     if(ie == -1)  goto j10;
  97.     }
  98.  
  99.     f = (ie-ip)*(ie-ip) + (id-iq)*(id-iq);
  100.     ic  = (int)sqrt( f );
  101.     icy =  ic;
  102.     _setcolor( 2 );  gcircle(0, ip, iq, ic);
  103.     press_prompt(2, ly);
  104.     gprint(63, ly+1, "a function key     ", 4);
  105.     gprint(63, ly+2, "on the toolbar.    ", 4);
  106.  
  107.     i = fgkey(0, 0);
  108.     printing = 0;
  109.     if(i == -1)  goto j10;
  110.     if(i == F1) { printing = 1; goto j10; }
  111.     if(i != cr)  return(i);
  112.  
  113. /* retrieve */
  114.     p[0] = ip - ic;  q[0] = iq + icy;
  115.     p[1] = ip + ic;  q[1] = iq - icy;
  116.     map_sub_prep(p, q, 2);
  117.     clear( 0 );
  118.     _setcolor( 4 );    /* Paint the area. */
  119.     gcircle(1, ip, iq, ic);
  120.     map_retrv( &itof );
  121.  
  122.     if(itof == 0) {
  123.     strcpy(em$, "No event was found.");
  124.     return(6 + F1 + 1);
  125.     }
  126.     return( table(1, itof) );
  127. }
  128.  
  129. /*** map subfunction-2 (select) ***/
  130. int map_select()
  131. {
  132.     int     p[4], q[4];
  133.     short   i, j, ly, printing;
  134.     unsigned iw;
  135.     char    *zseg;
  136.  
  137.     ly = 21;
  138.     printing = 0;
  139.     clear( 0 );
  140. j10:
  141.     dmap(mps$, 0);
  142.     epicenters();
  143.     gviewport(0, 0, 639, YPixels-1);
  144.  
  145. /* specify four corners of the area */
  146.     for(i=0; i<4; i++) {
  147.     if(i == 0) {
  148.         if(! printing) {
  149.         gprint(63, ly  , "Move the cross     ", 4);
  150.         gprint(63, ly+1, "to 1st area corner ", 4);
  151.         press_prompt(1, ly+2);
  152.         p[0] = (kx1+kx0)/2;  q[0] = (ky1+ky0)/2;
  153.         gcursor(kx0, ky0, kx1, ky1, &p[i], &q[i], 1);
  154.         if(p[i] == -1)  goto j10;
  155.         }
  156.     }
  157.     else {
  158.         if(! printing) {
  159.         switch( i ) {
  160.             case 1: gprint(63, ly+1, "to 2nd area corner ", 4); break;
  161.             case 2: gprint(63, ly+1, "to 3rd area corner ", 4); break;
  162.             case 3: gprint(63, ly+1, "to 4th area corner ", 4); break;
  163.         }
  164.         p[i] = p[i-1] + 3;
  165.         q[i] = q[i-1] - 2;
  166.         gcursor(kx0, ky0, kx1, ky1, &p[i], &q[i], 0);
  167.         if(p[i] == -1)  goto j10;
  168.         }
  169.         _setcolor( 2 );
  170.         gmoveto(p[i-1], q[i-1]);
  171.         glineto(p[i  ], q[i  ]);
  172.     }
  173.     }
  174.     glineto(p[0], q[0]);
  175.  
  176.     map_sub_prep(p, q, 4);
  177.  
  178.     press_prompt(2, ly);
  179.     gprint(63, ly+1, "a function key     ", 4);
  180.     gprint(63, ly+2, "on the toolbar.    ", 4);
  181.     i = fgkey(0, 0);
  182.     printing = 0;
  183.     if(i == -1)  goto j10;
  184.     if(i == F1) { printing = 1; goto j10; }
  185.     if(i != cr)  return( i );
  186.  
  187. /* confirmation */
  188.     strcpy(mc$[24],dp1$);  strcpy(mc$[25],dp2$);  strcpy(mc$[26],ynh$);
  189.     strcpy(mc$[27],mg1$);  strcpy(mc$[28],mg2$);  strcpy(mc$[29],ynm$);
  190.     strcpy(mc$[30],"Y");
  191.     isr = 30;
  192.     i = panel( MAPS2 );
  193.     if(i==3 || i==6)  return(i + F1 - 1);
  194.     if(!strcmp(mc$[30],"N"))  return(6 + F1 - 1);
  195.  
  196. /* select */
  197.     clear( 0 );
  198.     _setcolor( 4 );    /* Paint the area. */
  199.     gfillpolygon(p, q, 4);
  200.     map_retrv( &itot );
  201.  
  202.     iw = nmax/4095;
  203.     j = itot / 4095;  if(itot%4095 != 0) j++;
  204.     for(i=0; i<j; i++) {
  205.     zseg = iseg[i];
  206.     iseg[i] = iseg[iw+i];
  207.     iseg[iw+i] = zseg;
  208.     }
  209.  
  210.     strcpy(em$, "Memory contents were replaced.");
  211.     return(6 + F1 - 1);
  212. }
  213.  
  214. /**** map subfunction-3 (cross-section) ****/
  215. map_cross_section()
  216. {
  217.     int     p[4], q[4];
  218.     int     i, j, k, ds, rx1, rx2, itof; 
  219.     int     rv1, rv2, ir, vlen, vorg;
  220.     int     ixa, ixb, ixu, ixr, ixn;
  221.     int     iwo, ic, im;
  222.     double  uv, rva, ux, rc, rw;
  223.     double  f, xx, yy, hh, rm;
  224.  
  225.     i = project_area(p, q, &ds, &rw);
  226.     if(i != cr)  return( i );
  227.  
  228.     map_sub_prep(p, q, 4);
  229.  
  230. /* confirmation */
  231.     strcpy(mc$[18], "   0");  strcpy(mc$[19], jtoa(ds,w$,4));
  232.     strcpy(mc$[20], "   0");  strcpy(mc$[21], " 300");
  233.     isr = 18;
  234.     kd[6] = 6;
  235.     i = panel( MAPS3 );
  236.     if(i==3 || i==6)  return(i + F1 - 1);
  237.     rx1 = atoi(mc$[18]);  rx2 = atoi(mc$[19]);
  238.     rv1 = atoi(mc$[20]);  rv2 = atoi(mc$[21]);
  239.  
  240. /* retrieve */
  241.     clear( 0 );
  242.     _setcolor( 4 );    /* Paint the area. */
  243.     gfillpolygon(p, q, 4);
  244.     map_retrv( &itof );
  245.     clear( 0 );
  246.     _setbkcolor( 0 );
  247.  
  248. j10: /* legend */
  249.     gprint(27, 1, "Distance (km)", 2);
  250.     vprint(8, "Depth ^kmv");
  251.     gprint(63, 1, "CROSS-", 4);
  252.     gprint(63, 2, "SECTION", 4);
  253.     gprint(63,10, "leftmost", 2);
  254.     gprint(63,12, "rightmost", 2);
  255.     legend2(ds, itof);
  256.  
  257. /* draw cross-section */
  258.     _setcolor( 7 );
  259.     vorg = (int)(RowPixels * 2.5);
  260.     vlen = YPixels - (int)(RowPixels*3.5);
  261.     gbox(0, 40, vorg, 490, vlen+vorg-RowPixels);
  262.     vaxis(3, rv1, rv2, &ir, &uv, &rva);
  263.     scale(rx1, rx2, &ixa, &ixb, &ixu);
  264.     ixr = ixb - ixa;
  265.     ixn = ixr / ixu;
  266.     ux  = 418. / ixr;
  267.     _setcolor( 7 );
  268.     for(i=1; i<=ixn; i++) {
  269.     itoa(i*ixu+ixa, w$, 10);
  270.     j = 57 + (int)(i*ixu*ux);
  271.     k = _gettextextent( w$ ) / 2;
  272.     gmoveto(j, vorg-RowPixels/2);  glineto(j, vorg);
  273.     if(ixn<9 || i%2==0)  gfprint(j-k, RowPixels, w$, 7);
  274.     }
  275.     _setcolor( 3 );
  276.     j = 57 + (int)((rx1-ixa)*ux);
  277.     gmoveto(j, vorg-RowPixels/2);  glineto(j, vorg);
  278.     j = 57 + (int)((rx2-ixa)*ux);
  279.     gmoveto(j, vorg-RowPixels/2);  glineto(j, vorg);
  280.  
  281.     rc = q[0] - p[0]*rw;
  282.     iwo = nmax / 4095;
  283.     for(i=0; i<itof; i++) {
  284.     eqparm(i, &xx, &yy, &hh, &rm, iwo);
  285.     if(hh>=rv1 && hh<=rv2) {
  286.         f = rtal(xx, yy, rw, rc, p, q);
  287.         if(f>=rx1 && f<=rx2) {
  288.         j = 57 + (int)((f-ixa)*ux);
  289.         k = ir - (int)((hh-rva)*uv);
  290.         for(ic=ndp-1; ic>0; ic--)  if(hh >= cdp[ic]) break;
  291.         for(im=nmg-1; im>0; im--)  if(rm >= cmg[im]) break;
  292.         im = (int)rmg[im];
  293.         _setcolor( icd[ic] );
  294.         gcircle(0, j, k, im);
  295.         }
  296.     }
  297.     }
  298.  
  299.     i = fgkey(0, 1);
  300.     if(i==-1 || i==F1)  goto j10;
  301.     return( i );
  302. }
  303.  
  304. /**** map subfunction-4 (space-time) ****/
  305. int map_space_time()
  306. {
  307.     int    p[4], q[4];
  308.     int    i, j, k, ds, itof; 
  309.     int    rv1, rv2, ir, vlen, vorg;
  310.     int    jtm;
  311.     double st1, st2;
  312.     int    iwo, ic, im;
  313.     int    jy, jm, jd, jh, jn;
  314.     double uv, rva, rc, rw, f;
  315.     double xx, yy, hh, rm, rjt;
  316.  
  317.     i = project_area(p, q, &ds, &rw);
  318.     if(i != cr)  return( i );
  319.  
  320.     map_sub_prep(p, q, 4);
  321.  
  322. /* confirmation */
  323.     strcpy(mc$[18],y1$);  strcpy(mc$[19],m1$);  strcpy(mc$[20],d1$);
  324.     strcpy(mc$[21],h1$);  strcpy(mc$[22],n1$);  strcpy(mc$[23],s1$);
  325.     strcpy(mc$[24],y2$);  strcpy(mc$[25],m2$);  strcpy(mc$[26],d2$);
  326.     strcpy(mc$[27],h2$);  strcpy(mc$[28],n2$);  strcpy(mc$[29],s2$);
  327.     strcpy(mc$[30],"Y");
  328.     strcpy(mc$[31], "   0");  strcpy(mc$[32], jtoa(ds,w$,4));
  329.     isr = 18;
  330.     i = panel( MAPS4 );
  331.     if(i==3 || i==6)  return(i + F1 - 1);
  332.     kyy1 = atoi(mc$[18]);  kyy2 = atoi(mc$[24]);
  333.     km1  = atoi(mc$[19]);  km2  = atoi(mc$[25]);
  334.     kd1  = atoi(mc$[20]);  kd2  = atoi(mc$[26]);
  335.     kh1  = atoi(mc$[21]);  kh2  = atoi(mc$[27]);
  336.     if(!strcmp(mc$[30],"H"))  jtm = 3;
  337.     else if(!strcmp(mc$[30],"D"))  jtm = 2;
  338.     else if(!strcmp(mc$[30],"M"))  jtm = 1;
  339.     else  jtm = 0;
  340.     rv1 = atoi(mc$[31]);  rv2 = atoi(mc$[32]);
  341.  
  342. /* retrieve */
  343.     clear( 0 );
  344.     _setcolor( 4 );    /* Paint the area. */
  345.     gfillpolygon(p, q, 4);
  346.     map_retrv( &itof );
  347.     clear( 0 );
  348.     _setbkcolor( 0 );
  349.  
  350. j10: /* lengend */
  351.     i = 24;
  352.     vprint(8, "Distance ^kmv");
  353.     gprint(63, 1, "SPACE-", 4);
  354.     gprint(63, 2, "TIME", 4);
  355.     gprint(63,10, "bottom", 2);
  356.     gprint(63,12, "top", 2);
  357.     legend2(ds, itof);
  358.  
  359. /* draw space-time chart */
  360.     _setcolor( 7 );
  361.     vorg = 0;
  362.     vlen = YPixels - (int)(RowPixels*3.5);
  363.     gbox(0, 40, vorg, 490, vorg+vlen);
  364.     vaxis(1, rv1, rv2, &ir, &uv, &rva);
  365.     st1 = fncal(kyy1,km1,kd1);  st2 = fncal(kyy2,km2,kd2);
  366.     taxis(1, jtm, st1, st2);
  367.  
  368.     rc = q[0] - p[0]*rw;
  369.     iwo = nmax / 4095;
  370.     for(i=0; i<itof; i++) {
  371.     eqparm(i, &xx, &yy, &hh, &rm, iwo);
  372.     otparm(i, &jy, &jm, &jd, &jh, &jn, iwo);
  373.     f = rtal(xx, yy, rw, rc, p, q);
  374.     if(f>=rv1 && f<=rv2) {
  375.         rjt = fncal(jy,jm,jd);
  376.         if(rjt>=st1 && rjt<=st2) {
  377.         if(jtm == 3) {
  378.             if(rjt==st1 && jh<kh1)  goto j135;
  379.             if(rjt==st2 && jh>kh2)  goto j135;
  380.             j = 57 + (int)(((rjt-st1)*24.+jh+jn/60.-kh1)*ut);
  381.         }
  382.         else  j = 57 + (int)(((rjt-st1+(jh+jn/60.)/24.)*ut));
  383.         k = ir - (int)((f-rva)*uv);
  384.         for(ic=ndp-1; ic>0; ic--)  if(hh >= cdp[ic]) break;
  385.         for(im=nmg-1; im>0; im--)  if(rm >= cmg[im]) break;
  386.         im = (int)rmg[im];
  387.         _setcolor( icd[ic] );
  388.         gsymbol(j, k, im, icd[ic]);
  389.         }
  390.     }
  391. j135:   continue;
  392.     }
  393.  
  394.     i = fgkey(0, 1);
  395.     if(i==-1 || i==F1)  goto j10;
  396.     return( i );
  397. }
  398.  
  399. /*** map subfunction-5 (active faults) ***/
  400. int map_active_faults()
  401. {
  402.     int  ifc[4], i, nplot;
  403.     char fname[9];
  404.  
  405.     if(b1>123 && b2<150 && a1>23 && a2<50)  strcpy(mc$[0],"JAPAN   ");
  406.     else  strcpy(mc$[0],"        ");
  407.     strcpy(mc$[1],"5");  strcpy(mc$[2],"2");
  408.     strcpy(mc$[3],"3");  strcpy(mc$[4],"3");
  409.     isr = 0;
  410. j31:
  411.     i = panel( MAPS5 );
  412.     if(i==3 || i==6)  return(i + F1 - 1);
  413.     if(strcmp(mc$[0],"        ") == 0) {
  414.     strcpy(em$, "Invalid dataset name!");
  415.     goto j31;
  416.     }
  417.     strxcpy(fname, mc$[0]);
  418.     for(i=0; i<4; i++)  ifc[i] = atoi(mc$[i+1]);
  419.  
  420.     clear( 0 );
  421. j10:
  422.     i = dmap(fname, 1, ifc);
  423.     gviewport(0, 0, 639, YPixels-1);
  424.     if(! i)  goto j31;
  425.     dmap(mps$, 0);
  426.     nplot = epicenters();
  427.     gviewport(0, 0, 639, YPixels-1);
  428.     if(atoi(ync$) > 0)  nplot = - atoi( ync$ );
  429.     legend(mps$, nplot);
  430.  
  431.     i = fgkey(0, 1);
  432.     if(i==-1 || i==F1)  goto j10;
  433.     return(i);
  434. }
  435.  
  436. /*** map subfunction-6 (stations) ***/
  437. int map_stations()
  438. {
  439.     int    i, na, lx, ly, nplot;
  440.     char   *iwseg, f$[13], a$[5];
  441.     double xx, yy;
  442.  
  443.     strcpy(mc$[0], f2$);  strcpy(mc$[1], "N");
  444.     isr = 0;
  445. j31:
  446.     i = panel( MAPS6 );
  447.     if(i==3 || i==6)  return(i + F1 - 1);
  448.     if(strcmp(mc$[0],"        ") == 0) {
  449.     strcpy(em$, "Invalid dataset name!");
  450.     goto j31;
  451.     }
  452.     iwseg = iseg[nseg-1];
  453.     strxcpy(f$, mc$[0]);  strlwr( f$ );  strcat(f$, ".s");
  454.     if(! rbload(iwseg, 0, f$))  goto j31;
  455.  
  456.     clear( 0 );
  457. j10:
  458.     dmap(mps$, 0);
  459.     nplot = epicenters();
  460.     rbload(iwseg, 0, f$);
  461.     pspen(5, 0);
  462.     _setcolor( 4 );
  463.     gsmall_font();
  464.  
  465.     for(na=0; ; na+=16) {
  466.     for(i=0; i<4; i++)  a$[i] = peek(na+i+6,iwseg);
  467.     if(a$[3] == ' ') a$[3] = 0; else a$[4] = 0;
  468.     xx = bin2deg(na+10, iwseg);
  469.     yy = bin2deg(na+13, iwseg);
  470.     if(fabs(xx) > 254.)  break;
  471.     if(wrap && xx<0.)  xx = xx + 360.; /* wrap! */
  472.     if(xx>b1 && xx<b2 && yy>a1 && yy<a2) {
  473.         lx = (int)((xx-b1) * rrx);
  474.         ly = (int)((c2-lat(yy)) * rry);
  475.         gsymbol(lx, ly, 3, 7);
  476.         if(*mc$[1] == 'Y')  gfprint(lx+4, ly, a$, 4);
  477.     }
  478.     }
  479.     pspen(2, 0);
  480.     gviewport(0, 0, 639, YPixels-1);
  481.     if(atoi(ync$) > 0)  nplot = - atoi( ync$ );
  482.     legend(mps$, nplot);
  483.  
  484.     i = fgkey(0, 1);
  485.     if(i==-1 || i==F1)  goto j10;
  486.     return(i);
  487. }
  488.  
  489. void map_retrv( itt )
  490. int  *itt;
  491. {
  492.     short    lx, ly;
  493.     unsigned ra, is, iw, na;
  494.     double   xf, yf;
  495.     int    jy, jm, jd, jh, jn;
  496.  
  497.     *itt = 0;  ra = 0;  na = 4;
  498.     is = 0;  iw = nmax/4095;
  499.     /* `wrap' happens only if the region traverses the date line, and so 
  500.        360 degrees must be added to a western longitude in case of wrap = 1.*/
  501.     if( wrap ) {
  502.     if(lo1 < 0)  lo1 = lo1 + 360*256;
  503.     if(lo2 < 0)  lo2 = lo2 + 360*256;
  504.     }
  505.     _getimage();
  506.  
  507.     for(;;) {
  508.     ra = retrv(ra, *itt, is, iw);
  509.     if(ra == 0xffff)  break;
  510.     if(ra >  0x7fff) {
  511.         is++;  ra = 0;  na = 4;
  512.     }
  513.     else {
  514.         xf = bin2deg(na+ 7, iseg[iw]);
  515.         yf = bin2deg(na+10, iseg[iw]);
  516.         if(wrap && xf<0.)  xf = xf + 360.; /* wrap! */
  517.         yf = lat(yf);
  518.         lx = (int)((xf-b1)*rrx) + kx0+1;
  519.         ly = (int)((c2-yf)*rry) + ky0+1;
  520.     otparm(*itt, &jy, &jm, &jd, &jh, &jn, iw);
  521.     if(jm == 7) printf("%d:%d/%d(%d) ", *itt, jm, jd, _getpixel(lx,ly));
  522.         if(_getpixel(lx,ly)) { (*itt)++;  na += 16; }
  523.         if((*itt) == nmax2) {
  524.         poke(0xff, 0xfff4, iseg[iw]);
  525.         poke(0xff, 0xfff5, iseg[iw]);
  526.         break;
  527.         }
  528.         if((*itt)>0 && (*itt)%4095==0) {
  529.         poke(0xfe, 0xfff4, iseg[iw]);
  530.         poke(0xff, 0xfff5, iseg[iw]);
  531.         iw++;  na = 4;
  532.         }
  533.         ra++;
  534.     }
  535.     }
  536.     printf("nmax = %d, nmax2 = %d, iw = %d, itt = %d\n", nmax, nmax2, iw, *itt);
  537. }
  538.  
  539. project_area(p, q, ds, rw)
  540. int    p[], q[], *ds;
  541. double *rw;
  542. {
  543.     int      i, ly, printing;
  544.     double   rb, rc, rd, re;
  545.  
  546.     ly = 21;
  547.     printing = 0;
  548.     clear( 0 );
  549. j10:
  550.     dmap(mps$, 0);
  551.     epicenters();
  552.     gviewport(0, 0, 639, YPixels-1);
  553.  
  554. /* specify two ends of the axis and a width point */
  555.     for(i=0; i<3; i++) {
  556.     if(i == 0) {
  557.         if(! printing) {
  558.         gprint(63, ly  , "Move the cross     ", 4);
  559.         gprint(63, ly+1, "to 1st axis end    ", 4);
  560.         press_prompt(1, ly+2);
  561.         p[0] = (kx1+kx0)/2;  q[0] = (ky1+ky0)/2;
  562.         gcursor(kx0, ky0, kx1, ky1, &p[i], &q[i], 1);
  563.         if(p[i] == -1)  goto j10;
  564.         }
  565.     }
  566.     else {
  567.         if(! printing) {
  568.         switch( i ) {
  569.             case 1: gprint(63, ly+1, "to 2nd axis end    ", 4); break;
  570.             case 2: gprint(63, ly+1, "to width point     ", 4); break;
  571.         }
  572.         p[i] = p[i-1] + 3;
  573.         q[i] = q[i-1] - 2;
  574.         gcursor(kx0, ky0, kx1, ky1, &p[i], &q[i], 0);
  575.         if(p[i] == -1)  goto j10;
  576.         }
  577.         if(i == 1) {
  578.         _setcolor( 2 );
  579.         gmoveto(p[0], q[0]);
  580.         glineto(p[i], q[i]);
  581.         }
  582.     }
  583.     ital(p[i], q[i], &lo[i], &lom[i], &la[i], &lam[i]);
  584.     }
  585.  
  586. /* calculate distance */
  587.     *ds = (int)delta(lo[1]+lom[1]/60., la[1]+lam[1]/60.);
  588.  
  589. /* y1=w*x1+f : y2=w*x2+f: yr=w*xr+c */
  590. /* y2=-x2/w+d: y1=-x1/w+e           */
  591.     if(p[1] == p[0]) {
  592.     p[3] = p[2];
  593.     q[2] = q[1];
  594.     q[3] = q[0];
  595.     *rw = -1.;
  596.     }
  597.     else if(q[1] == q[0]) {
  598.     q[3] = q[2];
  599.     p[2] = p[1];
  600.     p[3] = p[0];
  601.     *rw = -2.;
  602.     }
  603.     else {
  604.     *rw = q[1] - q[0];
  605.     *rw = (*rw) / (p[1]-p[0]);
  606.     rc = q[2] - (*rw)*p[2];
  607.     rd = q[1] + p[1]/(*rw);
  608.     re = q[0] + p[0]/(*rw);
  609.     rb = (*rw) + 1./(*rw);
  610.     rd = (rd-rc) / rb;
  611.     p[2] = (int)rd;
  612.     q[2] = (int)((*rw)*rd + rc);
  613.     rd = (re-rc) / rb;
  614.     p[3] = (int)rd;
  615.     q[3] = (int)((*rw)*rd + rc);
  616.     }
  617.  
  618. /* plot the 3rd and 4th points */
  619.     _setcolor( 2 );
  620.     for(i=2; i<4; i++) {
  621.     gmoveto(p[i-1], q[i-1]);
  622.     glineto(p[i  ], q[i  ]);
  623.     ital(p[i], q[i], &lo[i+1], &lom[i+1], &la[i+1], &lam[i+1]);
  624.     }
  625.     glineto(p[0], q[0]);
  626.  
  627.     press_prompt(2, ly);
  628.     gprint(63, ly+1, "a function key     ", 4);
  629.     gprint(63, ly+2, "on the toolbar.    ", 4);
  630.  
  631.     i = fgkey(0, 0);
  632.     printing = 0;
  633.     if(i == -1)  goto j10;
  634.     if(i == F1) { printing = 1; goto j10; }
  635.     return( i );
  636. }
  637.  
  638. void map_sub_prep(p, q, max)
  639. int  p[], q[], max;
  640. {
  641.     int    pp, qq;
  642.     long   lo;
  643.     short  lom, la, lam, p1, p2, i;
  644.  
  645.     for(i=0; i<max; i++) {
  646.     ital(p[i], q[i], &lo, &lom, &la, &lam);
  647.     strcpy(mc$[i*6+0], jtoa(abs((int)lo),w$,-3));
  648.     strcpy(mc$[i*6+1], jtoa(lom,w$,-2));
  649.     if(lo < 0)  strcpy(mc$[i*6+2], "W");
  650.     else  strcpy(mc$[i*6+2], "E");
  651.     strcpy(mc$[i*6+3], jtoa(abs(la),w$,-2));
  652.     strcpy(mc$[i*6+4], jtoa(lam,w$,-2));
  653.     if(la < 0)  strcpy(mc$[i*6+5], "S");
  654.     else  strcpy(mc$[i*6+5], "N");
  655.  
  656.     pp = p[i];  qq = q[i];
  657.     if(pp < kx0) pp = kx0;
  658.     if(pp > kx1) pp = kx1;
  659.     if(qq < ky0) qq = ky0;
  660.     if(qq > ky1) qq = ky1;
  661.     ital(pp, qq, &lo, &lom, &la, &lam);
  662.     lo = lo*256 + lom;
  663.     la = la*256 + lam;
  664.     if(i == 0) {
  665.         p1 = pp;  p2 = pp;
  666.         lo1 = lo;  lo2 = lo;  la1 = la;  la2 = la;
  667.     }
  668.     else {
  669.         if(pp < p1) { p1 = pp;  lo1 = lo; }
  670.         if(pp > p2) { p2 = pp;  lo2 = lo; }
  671.         if(la < la1) la1 = la;  if(la > la2) la2 = la;
  672.     }
  673.     }
  674. }
  675.  
  676. void ital(lx, ly, lo, lom, la, lam)
  677. int   lx, ly;
  678. long  *lo;
  679. short *la, *lom, *lam;
  680. {
  681.     short  i;
  682.     double xxx, yyy;
  683.  
  684.     xxx = (lx-kx0)/rrx + b1;
  685.     if(xxx > 180.)  xxx = xxx - 360.;
  686.     *lo = (long)xxx;
  687.     if(xxx >= 0.)  *lom = (short)((xxx-*lo) * 60.);
  688.     else  *lom = (short)((*lo-xxx) * 60.);
  689.     yyy =  ym+c1 - (ly-ky0)/rry;
  690.     for(i=0; i<=180; i++)  if(yyy < yln[i])  break;
  691.     if(i > 90) {
  692.     *la = i - 91;
  693.     *lam = (short)((yyy-yln[i-1]) / dln[i-1] * 60.);
  694.     }
  695.     else {
  696.     *la = i - 90;
  697.     *lam = (short)((yln[i]-yyy) / dln[i-1] * 60.);
  698.     }
  699. }
  700.  
  701. double delta(bo, ba)
  702. double bo, ba;
  703. {
  704.     double  ao, aa, co, ca, dp, da, pi, rr; 
  705.     double  coa, soa, cob, sob, caa, saa, cab, sab;
  706.  
  707.     pi = 3.14159;
  708.     ao = lo[0] + lom[0]/60.;  aa = la[0] + lam[0]/60.;
  709.     co = ao/180.*pi;  ca = aa/180.*pi;  dp = bo/180.*pi;  da = ba/180.*pi;
  710.     coa = cos(co);  soa = sin(co);  cob = cos(dp);  sob = sin(dp);
  711.     caa = cos(ca);  saa = sin(ca);  cab = cos(da);  sab = sin(da);
  712.     co = caa*coa - cab*cob;
  713.     ca = caa*soa - cab*sob;
  714.     dp = saa - sab;
  715.     rr = co*co + ca*ca + dp*dp;
  716.     return(6369. * 2.*asin(0.5*sqrt(rr)));
  717. }
  718.  
  719. /* legend for cross-section & space-time */
  720. void legend2(ds, nplot)
  721. int  ds, nplot;
  722. {
  723.     short  i, j;
  724.     char   s[4];
  725.  
  726.     pfromto(-3, nplot);
  727.     for(i=0; i<2; i++) {
  728.     j = 11 + i*2;
  729.     jtoa(abs((int)lo[i]), w$, -3);
  730.     strcat(w$, " ");  strcat(w$, jtoa(lom[i],s,-2));
  731.     if(lo[i] < 0)  strcat(w$, "W-");
  732.     else  strcat(w$, "E-");
  733.  
  734.     strcat(w$, jtoa(abs((int)la[i]),s,-2));
  735.     strcat(w$, " ");  strcat(w$, jtoa(lam[i],s,-2));
  736.     if(la[i] < 0)  strcat(w$, "S");
  737.     else  strcat(w$, "N");
  738.     gprint(63, j, w$, 7);
  739.     }
  740.     gprint(63, 14, "length", 2);
  741.     itoa(ds, w$, 10);  strcat(w$, "km");
  742.     gprint(66, 15, w$, 7);
  743.  
  744.     mag_legend();
  745. }
  746.  
  747. double rtal(xx, yy, rw, rc, p, q)
  748. double xx, yy, rw, rc;
  749. int    p[], q[];
  750. {
  751.     double yyy, rd, rtx, rty, rlo, rla;
  752.     short  i;
  753.  
  754.     yyy = lat(yy);
  755.     if(wrap && xx<0.)  xx = xx + 360.;
  756.     rtx = (xx-b1)*rrx + kx0;
  757.     rty = (ym-yyy+c1)*rry + ky0;
  758.     if(rw == -1.)  rtx = p[0];
  759.     else if(rw == -2.)  rty = q[0];
  760.     else {
  761.     rd  = rty + rtx/rw;
  762.     rtx = (rd-rc) / (rw+1./rw);
  763.     rty = rw*rtx + rc;
  764.     }
  765.  
  766.     rlo = (rtx-kx0)/rrx + b1;
  767.     yyy =  ym+c1 - (rty-ky0)/rry;
  768.     for(i=0; i<=180; i++)  if(yyy < yln[i])  break;
  769.     if(i > 90)  rla = i - 91 + (yyy-yln[i-1])/dln[i-1];
  770.     else  rla = i - 90 + (yln[i]-yyy)/dln[i-1];
  771.     return( delta(rlo, rla) );
  772. }
  773.  
  774. void otparm(ia, jy, jm, jd, jh, jn, iss)
  775. int  ia, iss;
  776. int  *jy, *jm, *jd, *jh, *jn;
  777. {
  778.     char     *is;
  779.     int      ipag;
  780.     unsigned na;
  781.  
  782.     ipag = ia / 4095;
  783.     is   = iseg[iss+ipag];
  784.     na   = (ia-ipag*4095)*16 + 4;
  785.     *jy = fnyear(na,is);
  786.     *jm = peek(na+1,is);
  787.     *jd = peek(na+2,is);
  788.     *jh = peek(na+3,is);
  789.     *jn = peek(na+4,is);
  790. }
  791.  
  792. char *jtoa(i, s, n)
  793. int   i, n;
  794. char *s;
  795. {
  796.     unsigned j, nn;
  797.     char     t[31];
  798.  
  799.     nn = abs(n);
  800.     itoa(i, s, 10);
  801.     j = 0;
  802.     if(strlen(s) < nn)  for(; j<nn-strlen(s); j++) {
  803.     if(n < 0) t[j] = '0';  else t[j] = ' ';
  804.     }
  805.     t[j] = 0;
  806.     strcat(t, s);
  807.     strcpy(s, t);
  808.     return( s );
  809. }
  810.  
  811. void press_prompt(i, y)
  812. int  i, y;
  813. {
  814.     switch( i ) {
  815.     case 1: gprint(63, y, "and press a button.", 4); break;
  816.     case 2: gprint(63, y, "Press Enter or     ", 4); break;
  817.     }
  818. }
  819.  
  820. char maps2_pan[] ="\
  821.     Request : MAP SELECT                                                     \
  822.     Type Y or N and press Enter.                                             \
  823.     Points    Longitude-deg,min-   Latitude-deg,min-                         \
  824.        1st    <     ><    ><   >   <    ><    ><   >                         \
  825.        2nd    <     ><    ><   >   <    ><    ><   >                         \
  826.        3rd    <     ><    ><   >   <    ><    ><   >                         \
  827.        4th    <     ><    ><   >   <    ><    ><   >  Undetermined?          \
  828.     Depth -km-     <       >    -->     <       >        <   >               \
  829.     Magnitude      <      >     -->     <      >         <   >               \
  830.                                                                              \
  831.     Are these all right? <Y/N>  (   )                                        \
  832.                                                                              \
  833. 16,  3, -3 \
  834. 23,  3, -2 \
  835. 29,  3, -1 \
  836. 37,  3, -3 \
  837. 43,  3, -2 \
  838. 49,  3, -1 \
  839. 16,  4, -3 \
  840. 23,  4, -2 \
  841. 29,  4, -1 \
  842. 37,  4, -3 \
  843. 43,  4, -2 \
  844. 49,  4, -1 \
  845. 16,  5, -3 \
  846. 23,  5, -2 \
  847. 29,  5, -1 \
  848. 37,  5, -3 \
  849. 43,  5, -2 \
  850. 49,  5, -1 \
  851. 16,  6, -3 \
  852. 23,  6, -2 \
  853. 29,  6, -1 \
  854. 37,  6, -3 \
  855. 43,  6, -2 \
  856. 49,  6, -1 \
  857. 21,  7, -5 \
  858. 42,  7, -5 \
  859. 59,  7, -1 \
  860. 21,  8, -4 \
  861. 42,  8, -4 \
  862. 59,  8, -1 \
  863. 34, 10,  1 ";
  864.  
  865. char maps3_pan[] ="\
  866.     Request : MAP CROSS-SECTION                                              \
  867.     Change parameters in () as you like and press Enter.                     \
  868.                    Points    Longitude-deg,min-   Latitude-deg,min-          \
  869.     Projection Axis   1st    <     ><    ><   >   <    ><    ><   >          \
  870.                       2nd    <     ><    ><   >   <    ><    ><   >          \
  871.     Width/Direction          <     ><    ><   >   <    ><    ><   >          \
  872.                                                                              \
  873.     Drawing Range:                                                           \
  874.        X-axis <distance>  : X1 (      )                                      \
  875.                             X2 (      )                                      \
  876.        Y-axis <depth>     : Y1 (      )   Events with unknown depths will    \
  877.                             Y2 (      )   be plotted at 0km.                 \
  878.                                                                              \
  879. 31,  3, -3 \
  880. 38,  3, -2 \
  881. 44,  3, -1 \
  882. 52,  3, -3 \
  883. 58,  3, -2 \
  884. 64,  3, -1 \
  885. 31,  4, -3 \
  886. 38,  4, -2 \
  887. 44,  4, -1 \
  888. 52,  4, -3 \
  889. 58,  4, -2 \
  890. 64,  4, -1 \
  891. 31,  5, -3 \
  892. 38,  5, -2 \
  893. 44,  5, -1 \
  894. 52,  5, -3 \
  895. 58,  5, -2 \
  896. 64,  5, -1 \
  897. 33,  8,  4 \
  898. 33,  9,  4 \
  899. 33, 10,  4 \
  900. 33, 11,  4 ";
  901.  
  902. char maps4_pan[] ="\
  903.     Request : MAP SPACE-TIME                                                 \
  904.     Change parameters in () as you like and press Enter.                     \
  905.                    Points    Longitude-deg,min-   Latitude-deg,min-          \
  906.     Projection Axis   1st    <     ><    ><   >   <    ><    ><   >          \
  907.                       2nd    <     ><    ><   >   <    ><    ><   >          \
  908.     Width/Direction          <     ><    ><   >   <    ><    ><   >          \
  909.                                                                              \
  910.     Drawing Range:                                                           \
  911.        X-axis <time>   :  From (       /    /    ) (    :    :      )        \
  912.                           To   (       /    /    ) (    :    :      )        \
  913.                      Tick Unit (   )  <---Y/M/D/H <year/month/day/hour>      \
  914.        Y-axis <distance> : Y1  (      )                                      \
  915.                            Y2  (      )                                      \
  916.                                                                              \
  917. 31,  3, -3 \
  918. 38,  3, -2 \
  919. 44,  3, -1 \
  920. 52,  3, -3 \
  921. 58,  3, -2 \
  922. 64,  3, -1 \
  923. 31,  4, -3 \
  924. 38,  4, -2 \
  925. 44,  4, -1 \
  926. 52,  4, -3 \
  927. 58,  4, -2 \
  928. 64,  4, -1 \
  929. 31,  5, -3 \
  930. 38,  5, -2 \
  931. 44,  5, -1 \
  932. 52,  5, -3 \
  933. 58,  5, -2 \
  934. 64,  5, -1 \
  935. 33,  8,  4 \
  936. 41,  8,  2 \
  937. 46,  8,  2 \
  938. 53,  8,  2 \
  939. 58,  8,  2 \
  940. 63,  8,  4 \
  941. 33,  9,  4 \
  942. 41,  9,  2 \
  943. 46,  9,  2 \
  944. 53,  9,  2 \
  945. 58,  9,  2 \
  946. 63,  9,  4 \
  947. 33, 10,  1 \
  948. 33, 11,  4 \
  949. 33, 12,  4 ";
  950.  
  951. char maps5_pan[] ="\
  952.     Request : MAP ACTIVE-FAULTS                                              \
  953.     Give the name of a fault dataset, specify colors corresponding           \
  954.     to the activeness of fauls, and press Enter.                             \
  955.             Fault Dataset  (          )                                      \
  956.             Activeness     color      |                                      \
  957.              A             (   )      |  1 : Blue                            \
  958.              B and A-B     (   )      |  2 : Green                           \
  959.              C and B-C     (   )      |  3 : Cyan                            \
  960.              unknown       (   )      |  4 : Red                             \
  961.                                       |  5 : Magenta                         \
  962.                                       |  6 : Yellow                          \
  963.                                       |  7 : White                           \
  964. 29,  3,  8 \
  965. 29,  5,  1 \
  966. 29,  6,  1 \
  967. 29,  7,  1 \
  968. 29,  8,  1 ";
  969.  
  970. char maps6_pan[] ="\
  971.     Request : MAP STATIONS                                                   \
  972.     Give the name of a station dataset and press Enter.                      \
  973.                                                                              \
  974.     Station Dataset    (          )                                          \
  975.     Do you like to get station codes to be printed? < Y/N >  (   )           \
  976.                                                                              \
  977. 25,  3,  8 \
  978. 63,  4,  1 ";
  979.