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 >
Wrap
C/C++ Source or Header
|
1999-11-10
|
11KB
|
349 lines
/* SeisView alone/client Copyright (C) 1992,1998 K.Koketsu
<history>
98-11-03 Include panel definitions and remove CR.
98-10-06 Some global variables are replaced by constants.
98-10-01 _setbkcolor(0) in the initialization.
98-02-25 Abandon DOS, but take Windows 95/NT.
96-06-19 Support CISC NEWS and BSD/386. */
#include <math.h>
#include <stdio.h>
#include "ctlname.h"
#include "seis.h"
extern char *iseg[10]; /* work segments for selected events */
extern unsigned nseg; /* number of working segments */
extern int itot; /* total # selected events */
extern short isort; /* flag for sorting */
extern char z$[11], w$[81]; /* work string */
extern int text_rows;
/***************************** variables for menu ****************************/
extern char em$[51]; /* error message on menu */
extern char mc$[42][9]; /* field strings */
extern short isr; /* initial cursor position */
/**************************** variables for retrieval ************************/
extern char f2$[6];
extern char dst$[9];
extern char so1$[4], som1$[3], so2$[4], som2$[3];
extern char sa1$[3], sam1$[3], sa2$[3], sam2$[3];
extern char sew1$[2], sew2$[2], sns1$[2], sns2$[2];
extern char y1$[5], m1$[3], d1$[3], h1$[3], n1$[3], s1$[5];
extern char y2$[5], m2$[3], d2$[3], h2$[3], n2$[3], s2$[5];
extern char dp1$[6], dp2$[6], mg1$[5], mg2$[5];
/**************************** variables for map ******************************/
extern char to1$[4], tom1$[3], to2$[4], tom2$[3];
extern char ta1$[3], tam1$[3], ta2$[3], tam2$[3];
extern char tew1$[2], tew2$[2], tns1$[2], tns2$[2];
double rng[101];
int nn[101];
/******************* MAGNITUDE (Draw magnitude-frequency diagram) ************/
magnitude()
{
int i, j, k, rv2, jvk, jvl;
int imn, ut, iun, vlen, ir, nnu;
double f, rt1, rt2, tu, rm, uv, rva;
if(itot == 0) return( 3 );
isr=0;
strcpy(mc$[0], mg1$); strcpy(mc$[1], mg2$);
strcpy(mc$[2],"1.00");
strcpy(mc$[3],"ACM"); strcpy(mc$[4],"LOG");
itoa(itot,mc$[5],10);
j100:
if(panel(MAGNIT) == 3) return( 0 );
/* rt2 = atof(mc$[1]) doesn't work properly on BSD/386 v1.0. 94-03-18 */
rt1 = atof(mc$[0]); rt2 = atof(mc$[1]);
rv2 = atoi(mc$[5]);
tu = atof( mc$[2] );
if(!strcmp(mc$[3],"ACM")) jvk = 2; else jvk = 1;
if(!strcmp(mc$[4],"LOG")) jvl = 2; else jvl = 1;
clear( 0 );
_setbkcolor( 0 );
j200: /* legend */
if(jvk == 2) {
i = 1;
strcpy(w$, "Accumulated Frequency");
strcpy(z$, "(ACM)");
}
else {
i = 4;
strcpy(w$, "Frequency");
strcpy(z$, "(FRQ)");
}
vprint(i, w$);
gprint(63, 1, "Magnitude", 4);
gprint(74, 1, z$, 4);
legend3();
_setcolor( 7 );
/* axes */
vaxis(jvl, 0, rv2, &ir, &uv, &rva);
vlen = (int)(YPixels - RowPixels*3.5);
gfprint(8, vlen+1, "unknown", 5);
_setcolor( 7 );
imn = (int)((rt2-rt1) / tu);
if(imn*tu+rt1 < rt2) imn++;
for(i=0; i<imn+1; i++) rng[i] = rt1 + i*tu;
ut = 449 / (imn+1);
iun = imn / 8;
for(i=0; i<imn; i++) {
if(iun<=1 || i%iun==0) {
f = rng[i];
ggcvt(f, 4, w$); j = strlen(w$) - 1;
if(w$[j] == '.') w$[j] = 0;
k = 41 + ut*(i+1);
gmoveto(k, vlen); glineto(k, vlen+RowPixels/2);
j = _gettextextent( w$ ) / 2;
gfprint(k-j, vlen+RowPixels/2+2, w$, 7);
}
}
nnu = 0;
for(i=0; i<imn; i++) nn[i] = 0;
for(i=1; i<=itot; i++) {
rm = fnarg(i, 4);
if(rm < -9000.) nnu++;
else {
if(jvk == 2) {
for(j=0; j<imn; j++) if(rm >= rng[j]) nn[j]++;
}
else {
for(j=0; j<imn; j++) if(rm>=rng[j] && rm<rng[j+1]) nn[j]++;
}
}
}
_setcolor( 3 );
if(nnu > 0) {
if(jvk == 2) nnu = nnu + nn[0];
if(jvl == 1) k = (int)((nnu - rva) * uv);
else { f = nnu; k = (int)((log10(f)-rva) * uv); }
gbox(0, 41, ir-k, 41+ut, ir);
}
for(i=0; i<imn; i++) {
j = 41 + (i+1)*ut;
if(nn[i] > 0) {
if(jvl == 1) k = (int)((nn[i] - rva) * uv);
else { f = nn[i]; k = (int)((log10(f)-rva) * uv); }
gbox(1, j, ir-k, j+ut, ir);
}
}
_setcolor( 7 );
gmoveto(41, vlen); glineto(490, vlen);
k = fgkey(0, 1);
if(k==-1 || k==F1) goto j200;
else if(k == F3) return( 0 );
else goto j100;
}
void legend3()
{
pfromto(2, 0);
gprint(63, 9, "depth", 2);
strcpy(w$, dp1$); strcat(w$,"-");
strcat(w$, dp2$); strcat(w$,"km");
gprint(66, 10, w$, 7);
}
char s[2] = { 0, 0 };
void vprint(y, str) /* Write the name of a vertical axis. */
int y;
char *str;
{
unsigned i;
for(i=0; i<strlen(str); i++) {
*s = str[i];
gprint(1, y+i, s, 2);
}
}
/* Draw a vertical axis. */
void vaxis(iv, sv1, sv2, ir, uv, rva)
int iv, sv1, sv2, *ir;
double *uv, *rva;
{
int isu, rsa, rsb, ivn, ib, vlen, vorg;
int i, j;
double rvb, rvu, f;
vlen = (int)(YPixels - RowPixels*3.5);
vorg = (int)(RowPixels * 2.5);
if(iv != 3) { gmoveto(40, 0); glineto(40, vlen); }
scale(sv1, sv2, &rsa, &rsb, &isu);
if(iv == 2) {
f = rsa;
if(rsa <= 0) *rva = -1; else *rva = log10( f );
f = rsb; rvb = log10( f );
}
else {
rvu = isu; *rva = rsa; rvb = rsb;
ivn = (int)((rvb-*rva) / rvu);
}
switch( iv ) {
case 0: *ir = vlen - RowPixels;
*uv = (*ir-RowPixels)/(rvb-*rva); break;
case 3: *ir = vorg;
*uv = -(vlen-RowPixels)/(rvb-*rva); break;
default: *ir = vlen; *uv = (*ir-RowPixels)/(rvb-*rva); break;
}
_setcolor( 7 );
if(iv == 2) {
for(i=0; i<5; i++) {
if(i == 0) j = 1; else j = j * 10;
if(j > rsb) break;
ib = (int)(*ir - (i-*rva)*(*uv));
itoa(j,w$,10);
gfprint(38-_gettextextent(w$), ib-RowPixels, w$, 7);
gmoveto(32,ib); glineto(40, ib);
}
f = sv2;
ib = *ir - (int)((log10(f)-*rva)*(*uv));
itoa(sv2, w$, 10);
gfprint(38-_gettextextent(w$), ib-RowPixels, w$, 3);
gmoveto(32,ib); glineto(40, ib);
}
else {
for(i=0; i<=ivn; i++) {
ib = *ir - (int)(i*rvu*(*uv));
gmoveto(32,ib); glineto(40, ib);
if(ivn<=8 || i%2==0) {
j = (int)(i*rvu + *rva);
itoa(j, w$, 10);
if(j != -1)
gfprint(38-_gettextextent(w$), ib-RowPixels, w$, 7);
}
}
_setcolor( 5 );
ib = (int)(*ir - (sv1-*rva)*(*uv)); gmoveto(32,ib); glineto(40, ib);
ib = (int)(*ir - (sv2-*rva)*(*uv)); gmoveto(32,ib); glineto(40, ib);
}
}
void scale(rs1, rs2, rsa, rsb, isu)
int rs1, rs2, *rsa, *rsb, *isu;
{
int i, rj, ra;
rj = rs2 - rs1;
if(rj < 15) *isu = 1;
else if(rj < 150) *isu = 10;
else if(rj < 1500) *isu = 100;
else *isu = 1000;
*rsa = -1; *rsb = -1;
for(i= -1; i<=1000; i++) {/* NEWS cc warns me of `i=-1' (Strange!) */
ra = i * (*isu);
if(rs1 == ra) *rsa = ra;
if(*rsa==-1 && rs1>ra) *rsa = ra;
if(rs2 <= ra) { *rsb = ra; return; }
}
}
/********* pyformto ************ (Gprint retrieval conditons.) */
void pfromto(j, nplot)
int j, nplot;
{
int jj;
jj = abs( j );
gprint(63, jj, "data ", 2);
if(nplot == 0) sprintf(w$, "%d(%s)", itot, f2$);
else sprintf(w$, "%d(%s)", nplot, f2$);
gprint(68, jj++, w$, 7);
gprint(63, jj, "from", 2);
strcpy(w$, y1$); strcat(w$,"/");
strcat(w$, m1$); strcat(w$,"/");
strcat(w$, d1$);
gprint(68, jj++, w$, 7);
strcpy(w$, h1$); strcat(w$,":");
strcat(w$, n1$); strcat(w$,":");
strcat(w$, s1$);
gprint(68, jj++, w$, 7);
gprint(63, jj, "to", 2);
strcpy(w$, y2$); strcat(w$,"/");
strcat(w$, m2$); strcat(w$,"/");
strcat(w$, d2$);
gprint(68, jj++, w$, 7);
strcpy(w$, h2$); strcat(w$,":");
strcat(w$, n2$); strcat(w$,":");
strcat(w$, s2$);
gprint(68, jj++, w$, 7);
if(j > 0) {
strcpy(w$, sa1$); strcat(w$," "); strcat(w$, sam1$); strcat(w$,sns1$);
strcat(w$,"- ");
strcat(w$, sa2$); strcat(w$," "); strcat(w$, sam2$); strcat(w$,sns2$);
}
else {
strcpy(w$, ta1$); strcat(w$," "); strcat(w$, tam1$); strcat(w$,tns1$);
strcat(w$,"- ");
strcat(w$, ta2$); strcat(w$," "); strcat(w$, tam2$); strcat(w$,tns2$);
}
gprint(64, jj++, w$, 7);
if(j > 0) {
strcpy(w$, so1$); strcat(w$," "); strcat(w$, som1$); strcat(w$,sew1$);
strcat(w$,"-");
strcat(w$, so2$); strcat(w$," "); strcat(w$, som2$); strcat(w$,sew2$);
}
else {
strcpy(w$, to1$); strcat(w$," "); strcat(w$, tom1$); strcat(w$,tew1$);
strcat(w$,"-");
strcat(w$, to2$); strcat(w$," "); strcat(w$, tom2$); strcat(w$,tew2$);
}
gprint(63, jj++, w$, 7);
}
double fnarg(ng, ih)
int ng, ih;
{
int ipag, nn, mr;
char *ig;
double tg;
ipag = (ng-1) / 4095;
ig = iseg[ipag];
nn = (ng-1-ipag*4095)*16 + 4;
switch( ih ) { /* Ignore seconds for sorting to TIME. */
case 0: tg = (peek(nn+4,ig)/60. + peek(nn+3,ig))/24. + peek(nn+2,ig);
return(fnyear(nn,ig)*12. + peek(nn+1,ig) + tg/31.);
case 1: return( bin2deg(nn+ 7,ig) );
case 2: return( bin2deg(nn+10,ig) );
case 3: if(fnyear(nn,ig) < 1885) return(-1.);
else return(qeek(nn+13,ig)/10.);
case 4: mr = peek(nn+15,ig);
if(mr == 0) return(-9999.);
else if(mr & 0x80) return(-(mr&0x7f)/10.);
else return(mr/10.);
}
}
/************************ Panel Definitions **********************/
char magnit_pan[] = "\
Request : MAGNITUDE \
Specify attributes of the coordinates in () as you like and press Enter. \
X-Axis : Item < MAGNITUDE > \
Scaling < LINEAR > \
From ( ) \
To ( ) \
Tick Unit ( ) \
Y-Axis : Item ( ) <--- FRQ/ACM(Frequency/Accumulated) \
Scaling ( ) <--- LNR/LOG(Linear/Logarithmic) \
Maximum ( ) \
\
33, 4, 4 \
33, 5, 4 \
33, 6, 4 \
33, 7, 3 \
33, 8, 3 \
33, 9, 6 ";