Ejemplo n.º 1
0
void bounds_line(float *X, float *Y, int nsegs, int color, int ltype, int lwidth)
{
static char navigate[]="M";
int lhw = 0;
int whw = 0;

int iret;

      gsline (&ltype,&lhw,&lwidth,&whw,&iret);
      gscolr (&color,&iret);
      if(iret != 0) printf("iret 3 %d\n",iret);
      gline (navigate,&nsegs,X,Y,&iret,strlen(navigate));
}
Ejemplo n.º 2
0
void bounds_fill(float *X, float *Y, int nsegs, int color)
{
static char navigate[]="M";
float x1[LLMXPT],y1[LLMXPT];
int ltype,lhw,lwidth,whw,segc;
int i,iret;


   ltype = 1;
   lhw = 0; lwidth = 1; whw = 0;
   gsline (&ltype,&lhw,&lwidth,&whw,&iret);
   if(iret == 0)
      {
      gscolr (&color,&iret);
      /* gplt fill routine can only accept up to LLMXPT segments */
      if(nsegs > LLMXPT)
         {
         segc = LLMXPT;
         gfill (navigate,&segc,X,Y,&iret,strlen(navigate));
         while(segc < nsegs)
            {
            x1[0] = X[0]; y1[0] = Y[0];
            x1[1] = X[segc-1]; y1[1] = Y[segc-1];
            i = 2;
            while((i < LLMXPT)&&(segc < nsegs))
               {
               x1[i] = X[segc];
               y1[i] = Y[segc];
               i++;
               segc++;
               }
            gfill (navigate,&i,x1,y1,&iret,strlen(navigate));
            }
         }
      else
         gfill(navigate,&nsegs,X,Y,&iret,strlen(navigate));
      }
}
Ejemplo n.º 3
0
void wgem_gsline( int *iltyp, int *ilthw, int *iwidth, int *ilwhw, int *iret )
/************************************************************************
 * wgem_gsline             						*
 *									*
 * This function is a wrapper for gsline.				*
 *									*
 * void wgem_gsline( iltyp, ilthw, iwidth, ilwhw, iret )		*
 *									*
 * Input parameters:							*
 *	*iltyp		int	line type          			*
 *	*ilthw		int	sw/hw line type flag      		*
 *	*iwidth		int	line width size multiplier		*
 *	*ilwhw		int	sw/hw line width flag     		*
 *									*
 * Output parameters:							*
 *	*iret		int	return code				*
 **									*
 * Log:									*
 * E. Safford/SAIC	11/07	initial coding                          *
 ***********************************************************************/
{
    gsline( iltyp, ilthw, iwidth, ilwhw, iret );
}
Ejemplo n.º 4
0
int trackingpoint_bot() {

	MSG msg;

	while (GetMessage(&msg, NULL, 0, 0)>0) {
		DispatchMessage(&msg);
		ibx = x_coordinate;
		iby = y_coordinate;
		if (iby <= By_ini + (int)(izoom_B*ncount*deltad / mpp) && iby >= By_ini) {
			for (i = 0; i<nposi; ++i) {
				nx0 = Bx_ini + (int)(izoom_B*rwb*i);
				if (ibx >= nx0 && ibx<nx0 + (int)(izoom_B*rwb) && ipeakflg[i] == 0) {
					ipeak22[i] = (int)((iby - By_ini)*mpp / deltad / izoom_B) - (int)(mpp / deltad);
					gsline(nx0, iby, nx0 + (int)(izoom_B*rwb), iby, gscolor);
					ipeakflg[i] = 1;
				}
			}
		}
		ipeaksum = 0;
		for (i = 0; i<nposi; ++i) ipeaksum = ipeaksum + ipeakflg[i];
		if (ipeaksum == nposi) break;
	}
	return 0;
}
Ejemplo n.º 5
0
int main(void)
{
	/* *************************************************************************
		Create Window
		********************************************************************** */
	wwB = 1000;
	wid = pageb(100, 0, 900, wwB, "B-mode");
	start();
	Bx_ini = 100; By_ini = 100;
	/**************************************************************************
	Input Serial No.
	********************************************************************** */
	//printf("input beginning and end of #serial\n");
	//scanf("%d %d", &iseq1);
	iseq1 = 101;
	printf("iseq1 = %d \n", iseq1);
	printf("*******************************\n");
	printf("*       start analysing       *\n");
	printf("*******************************\n");
	/* *************************************************************************
	Reading Parameters from File
	********************************************************************** */
start:;
	if ((fin = fopen("./ssd6500.coe", "r")) == NULL){
		fprintf(stderr, "cannot open dpman1M.coe\n");
		exit(1);
	}

	icfile = 0;
	while (icfile == 0){
		fscanf(fin, "%d %s %d %d %s %d %f %d %d %d %d",
			&islct00, name, &iseq, &nfhead, fname, &iage, &rryy, &icnt, &ip_s, &ip_d,
			&anabt);
		if (iseq == iseq1) icfile = 1;
		if (islct00 == 9){ fclose(fin); exit(0); }
	}
	fclose(fin);
	rmaxdh = 1e-6*icnt;

	printf("islct00 = %d\n", islct00);
	printf("Name of subject = %s\n", name);
	printf("Serial number = %d\n", iseq);
	printf("Age of subject = %d years old\n", iage);
	printf("Maximal velocity range = %f m/s\n", rryy);
	printf("Systolic & Diastolic blood pressure = %d, %d mmHg\n", ip_s, ip_d);
	/* *************************************************************************
	Read Raw Data from File
	********************************************************************** */
	sprintf(fall, "%s%s.rfa", fhead[nfhead], fname);
	printf("File name = %s\n", fall);
	if ((fin = fopen(fall, "rb")) == NULL){
		printf("cannot open file: %s\n", fall);
		exit(1);
	}

	fseek(fin, 480L, SEEK_SET);
	//fread(buf,sizeof(char),480,fin);
	fread(&fdat, sizeof(float), 1, fin);   /* 送信周波数 [MHz] */
	printf("f0 = %f Hz\n", f0 = 1e6*fdat);
	fread(&fdat, sizeof(float), 1, fin);   /* Burst波数 */
	fread(&usdat, sizeof(unsigned short), 1, fin);
	npb = usdat;
	fread(&fdat, sizeof(float), 1, fin);   /* PRF [kHz] */
	printf("PRF = %f Hz\n", 1e3*fdat);
	fread(&fdat, sizeof(float), 1, fin);   /* 受信サンプリング周波数 [MHz] */
	printf("fs = %f Hz\n", fs = 1e6*fdat);
	fread(&fdat, sizeof(float), 1, fin);   /* ビーム間隔 [mm] */
	printf("beam interval = %f mm\n", elp = fdat);
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* ビーム数 */
	printf("number of beams = %d\n", nposi = usdat);
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* ROI上端深さ(point)=0 */
	printf("record offset = %d\n", usdat);
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* ビーム数当たりサンプル数 */
	printf("number of samples per line = %d\n", ncount = usdat);
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* 開始ビーム番号 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* 終了ビーム番号 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* フォーカス段数 */
	for (i = 0; i<7; ++i) fread(&fdat, sizeof(float), 1, fin);   /* フォーカス位置設定 */
	for (i = 0; i<4; ++i)
		fread(&usdat, sizeof(unsigned short), 1, fin);   /* フォーカス音圧設定 */
	fread(&fdat, sizeof(float), 1, fin);   /* ステア角 [degree] */
	printf("steering angle: %f\n", fdat);
	fread(&fdat, sizeof(float), 1, fin);   /* フレームレート [Hz] */
	printf("frame rate = %f Hz\n", PRF2 = fdat);
	fread(&fdat, sizeof(float), 1, fin);   /* スケールファクター */
	fread(&uldat, sizeof(unsigned long), 1, fin);   /* フレーム数 */
	printf("number of frames = %d\n", nframe = uldat);
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* データ情報 */
	fread(&fdat, sizeof(float), 1, fin);   /* 受信周波数 [MHz] */
	//printf("receiving frequency: %f MHz\n",fdat);
	for (i = 0; i<14; ++i) fread(&cdat, sizeof(char), 1, fin);   /* 未使用 */
	for (i = 0; i<4; ++i) fread(&usdat, sizeof(unsigned short), 1, fin);   /* 諸設定 */
	for (i = 0; i<16; ++i) fread(&cdat, sizeof(char), 1, fin);   /* Sweepファイル名 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* bit resolution */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* 波形種別 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* 波形関数 */
	fread(&fdat, sizeof(float), 1, fin);   /* 振幅補正 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* データ数 */
	fread(&fdat, sizeof(float), 1, fin);   /* 比帯域 */
	//fread(&fdat,sizeof(float),1,fin);   /* Flat比率 */
	//fread(&fdat,sizeof(float),1,fin);   /* 送信波形 台 */
	for (i = 0; i<8; ++i) fread(&cdat, sizeof(char), 1, fin);  /* スペア */
	fread(&fdat, sizeof(float), 1, fin);   /* 送信サンプル周波数 [MHz] */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* Ex-PHDのon/off */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* B FE-Gain上限 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* B FE-Gainの下限 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* B-Gain */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* 送信回数 */
	printf("number of transmissions per line: %d\n", usdat);
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* アライメント */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* プレーン識別番号 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* 空間コンパウンド識別番号 */
	printf("spatial compound: %d\n", usdat);
	fread(&fdat, sizeof(float), 1, fin);   /* 音響パワー */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* Interm Frame */
	fread(&fdat, sizeof(float), 1, fin);   /* Interm Inverval */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* エラスト識別番号 */
	fread(&usdat, sizeof(unsigned short), 1, fin);   /* RFビット位置 */
	for (i = 0; i<4; ++i) fread(&cdat, sizeof(char), 1, fin);
	//fread(&uldat,sizeof(unsigned long),1,fin);
	/*printf("number of data = %d bytes\n",uldat);*/
	/*printf("%d bytes\n",4*4+4*ncount*nposi*nframe);*/


	fseek(fin, 996L, SEEK_SET); //932

	// loading RF data
	tcnt = (4 + ncount)*nposi*nframe;
	raw_dat = (int *)malloc((size_t)(4 * tcnt));
	fread(raw_dat, sizeof(int), tcnt, fin);

	printf("raw size = %f\n", sizeof(raw_dat) / sizeof(int));


	// loading physio data (ECG)
	fread(&idcnt, sizeof(int), 1, fin);
	icnt = (idcnt & 0x3FFFC00) >> 6;
	printf("icnt = %d\n", icnt);
	for (i = 0; i<3; ++i) fread(&idcnt, sizeof(int), 1, fin);
	for (i = 0; i<icnt; ++i){
		fread(&emin, sizeof(unsigned short), 1, fin);
		fread(&emax, sizeof(unsigned short), 1, fin);
		fread(&pmin, sizeof(unsigned short), 1, fin);
		fread(&pmax, sizeof(unsigned short), 1, fin);
		fread(&plmin, sizeof(unsigned short), 1, fin);
		fread(&plmax, sizeof(unsigned short), 1, fin);
		for (j = 0; j<18; ++j) fread(&idcnt, sizeof(unsigned short), 1, fin);
		idcnt = PRF2*i / 1000.;
		ecg[i] = emax;
		pcg[i] = plmax;

	}

	fclose(fin);

	fin = fopen("./ecg.dat", "w");
	for (i = 0; i<icnt; ++i) fprintf(fin, "%f\n", ecg[i]);
	fclose(fin);

	/*fin=fopen("./pcg.dat","w");
	for(i=0;i<icnt;++i) fprintf(fin,"%f\n",pcg[i]);
	fclose(fin);*/

	for (i = 0; i<nframe; ++i){
		for (j = 0; j<nposi; ++j){
			ihof[j][i] = (4 + ncount)*j + (4 + ncount)*nposi*i;
		}
	}

	nfr_low = nframe;
	printf("interval of beams = %f mm\n", elp);
	dadd = 4 * 2 * elp / 0.15;

	/* Post ECG */
	for (i = 0; i<nframe; ++i){
		MpF = (int)(1000 / PRF2*i);
		ecgmax = ecg[MpF];
		ecg[i] = ecgmax;
	}

	fin = fopen("./ecg2.dat", "w");
	for (i = 0; i<nframe; ++i) fprintf(fin, "%f\n", ecg[i]);
	fclose(fin);
	/* *************************************************************************
	Setting Parameters (Temporal)
	********************************************************************** */
	if (aux_flg == 0) iaux = 5;
	if (aux_flg == 1) iaux = 6;
	f0i = f0;
	ifs = (int)(fs / 1e6);
	nspc = 1;
	if (SPAv == 1) nspc = 1;
	/* *************************************************************************
	Setting Parameters
	********************************************************************** */
	heartrate = 100;
	p_s = (float)ip_s;
	p_d = (float)ip_d;
	icgain = 4000000;
	idltx = 10;      /* nwv wavelength (default:4x) */
	idltx2 = 10;
	deltad = c0 / (fs*2.0);
	lp2s = (int)(2.0 / f0*fs);
	lp2q = (int)(2.0 / f0*fs); /* cut off frequency in quadrature demodulation */

	//f0=5.5*1e+6;
	/* *************************************************************************
	Memory Allocation
	********************************************************************** */
	if (ncount >= nframe){
		dmy = (float *)malloc((size_t)(8 * (ncount + 1)));
		sgn = (float *)malloc((size_t)(8 * (ncount + 1)));
	}
	if (nframe>ncount){
		dmy = (float *)malloc((size_t)(8 * (nframe + 1)));
		sgn = (float *)malloc((size_t)(8 * (nframe + 1)));
	}
	/* *************************************************************************
	Read ECG, PCG, AUX
	********************************************************************** */
	ecgbias = 0.0; icnt = 0;
	for (i = 0; i<nframe / 2; ++i){
		ecgbias = ecgbias + ecg[i];
		++icnt;
	}
	for (i = 0; i<nframe; ++i) ecg[i] = ecg[i] - ecgbias / (float)icnt;
	ecgmax = 0.0;
	for (i = 0; i<nframe / 2; ++i){
		if (fabs(ecg[i])>ecgmax) ecgmax = fabs(ecg[i]);
	}

	pcgbias = 0.0; icnt = 0;
	for (i = 0; i<nframe / 2; ++i){
		pcgbias = pcgbias + pcg[i];
		++icnt;
	}
	for (i = 0; i<nframe; ++i) pcg[i] = pcg[i] - pcgbias / (float)icnt;
	pcgmax = 0.0;
	for (i = 0; i<nframe / 2; ++i){
		if (fabs(pcg[i])>pcgmax) pcgmax = fabs(pcg[i]);
	}
	/* ****************************************************************************
	Detect Timing of R-wave
	************************************************************************* */
	nbeat = 0; beat = 0.0;
	ilevel = 0.6*ecgmax;
	period = 1.0 / (heartrate / 60.0);

	for (j = 0; j<maxfrm; ++j){
		if (j == 0) ii1 = 0;
		if (j >= 1) ii1 = track0[j - 1] + (int)(PRF2*period);
		if (ii1>nframe) break;
		for (i = ii1 + 1; i<nframe; ++i){
			if (ecg[i] >= ilevel){
				track0[j] = i;
				nbeat = nbeat + 1;
				break;
			}
			if (i == nframe - 1) break;
		}
		if (track0[j]<0){
			nbeat = nbeat - 1;
			break;
		}
		if (track0[j] == 0) break;
		for (i = 0; i <= j - 1; ++i){
			beat = beat + (float)(track0[i + 1] - track0[i]);
		}
		beat = beat / (float)(j + 1);
	}
	tbeat = beat / fs * 1000;

	/*for(i=0;i<nbeat;++i){
	rr=ecg[track0[i]];
	for(j>track0[i]-(int)(0.01*PRF2);j<track0[i]+(int)(0.01*PRF2);++j){
	if(j>=0 && j<nframe && fabs(ecg[j])>rr){
	rr=fabs(ecg[j]);
	icnt=j;
	}
	}
	track0[i]=j;
	}*/

	for (i = 0; i<nbeat; ++i){
		printf("track0(%d) = %d\n", i, track0[i]);
	}
	//nbeat=2;
	//track0[0]=0; track0[1]=nframe;

	/* *************************************************************************
	Setting Parameters
	********************************************************************** */
	ifrm1 = 0;
	ifrm2 = nframe;
	if (nbeat == 0){
		ifrm1 = 0;
		ifrm2 = nframe;
	}
	if (nbeat>0){
		ifrm1 = track0[0] - (int)(0.2*PRF2);
		if (ifrm1<0) ifrm1 = 0;
		ifrm2 = nframe;
	}
	printf("ifrm1, ifrm2 = %d, %d\n", ifrm1, ifrm2);
	if (ifrm1<0 || ifrm2>nframe || ifrm1>ifrm2) exit(0);
	/* *************************************************************************
	Display B-mode Image
	********************************************************************** */
	rmaxz = 0.0;
	for (i = 0;i < nposi;++i){
		for (j = 0; j < ncount; ++j) {
			dmy[j] = pow((float)raw_dat[ihof[i][track0[0]] + j + 4], 2);
		}
		wint2s(wary, lp2s);
		ndmy = ncount;
		lpfs(wary, dmy, sgn, lp2s, ndmy);
		for (j = 0; j<ncount; ++j){
			sgn[j] = sqrt(sgn[j]);
			if (fabs(sgn[j])>rmaxz) rmaxz = fabs(sgn[j]);
		}
	}

	rwb = dadd / 8.;
	nwb = (int)rwb;
	/* 直交検波 */
	for (i = 0; i<nposi; ++i){
		for (j = 0; j<ncount; ++j){
			dmy[j] = pow((float)raw_dat[ihof[i][track0[0]] + j + 1], 2);
		}
		wint2s(wary, lp2s);
		ndmy = ncount;
		lpfs(wary, dmy, sgn, lp2s, ndmy);
		for (j = 0; j<ncount; ++j) sgn[j] = sqrt(sgn[j]);

		for (j = 0; j<ncount; ++j){
			ic = 49 + (int)(100.*(20.*log10((sgn[j] + 1e-4) / rmaxz) + B_gain) / B_gain);
			if (ic<49) ic = 49;
			if (ic>148) ic = 148;
			ic = (ic - 49) * 255 / 99;
			gscolor = gscol256(ic, ic, ic);
			for (k = 0;k < (int)(izoom_B / (mpp / deltad) + 1);++k) {
				gsline(Bx_ini + (int)(izoom_B*rwb*i),
					By_ini + (int)(izoom_B*j*deltad / mpp) + k,
					Bx_ini + (int)(izoom_B*rwb*(i + 1)),
					By_ini + (int)(izoom_B*j*deltad / mpp) + k,
					gscolor);
			}
		}
	}

	gscolor = gscol256(0, 0, 0);
	gsline(Bx_ini - 15, By_ini, Bx_ini - 15,
		By_ini + (int)(izoom_B*ncount*deltad / mpp), gscolor);
	for (i = 0;i<ncount;i = i + (int)(5 * mpp / deltad)) {
		gsline(Bx_ini - 15, By_ini + (int)(izoom_B*i*deltad / mpp),
			Bx_ini - 10, By_ini + (int)(izoom_B*i*deltad / mpp), gscolor);
	}
	for (i = 0;i<ncount / 5;i = i + (int)(5 * mpp / deltad)) {
		gsline(Bx_ini - 15, By_ini + (int)(5.*izoom_B*i*deltad / mpp),
			Bx_ini - 5, By_ini + (int)(5.*izoom_B*i*deltad / mpp), gscolor);
	}
	gsline(Bx_ini, By_ini - 15, Bx_ini + (int)(izoom_B*rwb*nposi), By_ini - 15, gscolor);
	for (i = 0;i<(int)(rwb*nposi / 10.) + 1;++i) {
		gsline(Bx_ini + izoom_B * 10 * i, By_ini - 15,
			Bx_ini + izoom_B * 10 * i, By_ini - 5, gscolor);
	}
	sprintf(buf, "%4d %56s", iseq, fall);
	ptext(10, By_ini - 65, strlen(buf), buf);
	sprintf(buf, "age:%2d BP: %3d/%3d", iage, ip_s, ip_d);
	ptext(10, By_ini - 50, strlen(buf), buf);
	sprintf(buf, "mkdirhier ./images/%s", fname);
	//system(buf);
	/*sprintf(buf,"import -window 0x%x -crop %dx%d+%d+%d -silent ./images/%s/Bmode.gif",
	wid,(int)(izoom_B*rwb*nposi),
	(int)(izoom_B*ncount*deltad/mpp),
	Bx_ini,wwB-By_ini+60,fname);*/
	sprintf(buf, "import -window 0x%x -silent ./images/%s/Bmode.gif", wid, fname);
	//system(buf);
	/* *************************************************************************
	Setting Tracking Position by Tracing B-mode (itrace=1)
	********************************************************************** */
	if (itrace == 1){
		gscolor = gscol256(0,0,255);
		for (i = 0; i<nposi; ++i) ipeakflg[i] = 0;
		cursorpos(0, 0);
		trackingpoint_top();
		cursorpos(0, 0);
		for (i = 0; i<nposi0; ++i) ipeakflg[i] = 0;
		trackingpoint_bot();

		///* Save Peak Position */
		//fin = fopen("./tmp/peaks", "w");
		//for (i = 0; i<nposi; ++i)
		//	fprintf(fin, "%d %d %d %d\n", ipeak11[i], ipeak22[i], ipeak33[i], ipeak44[i]);
		//fclose(fin);
	}
	if (itrace == 0){
		sprintf(buf, "./tmp/peaks.%d", iseq1);
		fin = fopen(buf, "r");
		for (i = 0; i<nposi; ++i){
			fscanf(fin, "%d %d %d %d", &ip1, &ip2, &ip3, &ip4);
			ipeak11[i] = ip1; ipeak22[i] = ip2; ipeak33[i] = ip3; ipeak44[i] = ip4;
		}
		fclose(fin);
	}
	if (DispTr == 1){
		gscolor = gscol256(255,0,0);
		for (i = 0; i<nposi; ++i){
			gscolor = gscol256(0,0,0);
			for (k = 0; k<(int)(izoom_B / (mpp / deltad) + 1); ++k)
				gsline(Bx_ini + (int)(izoom_B*rwb*i),
				By_ini - (int)(izoom_B*ipeak33[i] * deltad / mpp) - k,
				Bx_ini + (int)(izoom_B*rwb*(i + 1)),
				By_ini - (int)(izoom_B*ipeak33[i] * deltad / mpp) - k, gscolor);
		}
	}

	for (i = 0; i<nposi; ++i){
		if (ipeak44[i] - ipeak33[i]<4 * idltx2) ipeak44[i] = ipeak33[i] + 4 * idltx2;
	}
	Sleep(1);
	gscolor = gscol256(0,0,0);
	if (ipause == 1){
		printf("Input 0 if ready to go next.\n");
		scanf("%d", &iflg);
	}
	/* *************************************************************************
	Clear Window
	********************************************************************** */
	eraseg();
	/* *************************************************************************
	Estimation of Displacements
	********************************************************************** */
	ifrm1 = track0[anabt]; ifrm2 = track0[anabt + 2]; dsh = 1;

	for (i = 0; i<nDFT; ++i) han_w[i] = 0.5 - 0.5*cos(rad*i / (float)nDFT);
	sprintf(buf, "mkdirhier ./images/%s/Mmode", fname);
	//system(buf);
	//sprintf(buf, "./ddmax_%s.dat", fname);
	sprintf(buf, "./ddmax.dat", fname);
	fin = fopen(buf, "w");
	for (iiposi = 0; iiposi<nposi; ++iiposi){
		ddmax = 0.0;
		eraseg();
		sprintf(buf, "%4d %56s", iseq, fall);
		ptext(100, wwB + 10, strlen(buf), buf);
		sprintf(buf, "age:%2d, BP: %3d/%3d, vel. max: %5.1f mm/s, dd max: %6.1f um, beam position: %2d",
			iage, ip_s, ip_d, 1e3*rryy, 1e6*rmaxdh, iiposi + 1);
		ptext(100, wwB + 22, strlen(buf), buf);
		if (aux_flg == 0)
			sprintf(buf, "max. & bias of ECG: %7.1f, %7.1f, max. PCG: %7.1f",
			ecgmax, ecgbias / PRF2, pcgmax);
		if (aux_flg == 1)
			sprintf(buf, "max & bias of ECG: %7.1f, %7.1f, max. PULSE: %7.1f",
			ecgmax, ecgbias / PRF2, pcgmax);
		ptext(100, wwB + 34, strlen(buf), buf);
		/* *************************************************************************
		Setting Tracking Position and Number of Tracking Points
		********************************************************************** */
		ndep[iiposi] = 2;
		/* *************************************************************************
		Display M-mode Image
		********************************************************************** */
		lp2s = (int)(2.0 / f0*fs);
		Mx_ini = 50; My_ini = 800;
		ry0 = nframe / 200.;
		iy0 = (int)ry0;
		if (iy0<1) iy0 = 1;
		for (i = 0; i<200; ++i){
			for (j = 0; j<ncount; ++j)
				dmy[j] = pow((float)raw_dat[ihof[iiposi][(int)(ry0*i)] + j], 2);
			wint2s(wary, lp2s);
			ndmy = ncount;
			lpfs(wary, dmy, sgn, lp2s, ndmy);
			for (j = 0; j<ncount; ++j)
				sgn[j] = sqrt(sgn[j]);
			for (j = 0; j<ncount; j = j + (int)(mpp / deltad / izoom_M)){
				ic = 49 + (int)(100.*((20.*log10(sgn[j] / rmaxz) + B_gain) / B_gain));
				if (ic<49) ic = 49;
				if (ic>148) ic = 148;
				ic = (ic - 49) * 255 / 99;
				gscolor = gscol256(ic, ic, ic);
				for (k = -1; k <= 1; ++k)
					gsline(Mx_ini + (int)(izoom_M*j*deltad / mpp), My_ini - 3 * i - k,
					Mx_ini + (int)(izoom_M*j*deltad / mpp), My_ini - 3 * (i + 1) - k, gscolor);
			}
		}
		gscolor = gscol256(0, 0, 0);
		gsline(Mx_ini, My_ini + 15,
			Mx_ini + (int)(izoom_M*ncount*deltad / mpp), My_ini + 15, gscolor);
		for (i = 0; i < ncount; i = i + (int)(5 * mpp / deltad)) {
			gsline(Mx_ini + (int)(izoom_M*i*deltad / mpp), My_ini + 15,
				Mx_ini + (int)(izoom_M*i*deltad / mpp), My_ini + 10, gscolor);
		}
		for (i = 0; i < ncount / 5; i = i + (int)(5 * mpp / deltad)) {
			gsline(Mx_ini + (int)(5.*izoom_M*i*deltad / mpp), My_ini + 15,
				Mx_ini + (int)(5.*izoom_M*i*deltad / mpp), My_ini + 5, gscolor);
		}
		gsline(Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 10, My_ini,
			Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 10, My_ini - 600, gscolor);
		for (i = 0; i < (int)(2.*nframe / PRF2) + 1; ++i) {
			gsline(Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 10,
				My_ini - (int)(300.*PRF2 / nframe*i),
				Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 5,
				My_ini - (int)(300.*PRF2 / nframe*i), gscolor);
		}
			
		/* *************************************************************************
		Frame for Displaying Signals
		********************************************************************** */
		for (i = 0; i<4; ++i){
			gsrect(Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 20 + 100 * i,
				My_ini + 15,
				Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 110 + 100 * i,
				My_ini - 615, RGB(255, 255, 255), RGB(0, 0, 0));
		}
		for (i = 0; i<4; ++i){
			for (j = 0; j<2; ++j){
				for (k = 0; k<3; ++k){
					gsline(Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 30 + 35 * k + 100 * i,
						My_ini + 15 - 622 * j,
						Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 30 + 35 * k + 100 * i,
						My_ini + 15 - 8 - 622 * j, gscolor);
				}
			}
		}
		for (i = 0; i<4; ++i){
			gsline_d(Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 20 + 45 + 100 * i, My_ini,
				Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 20 + 45 + 100 * i,
				My_ini - 600, gscolor);
		}

		for (i = 0; i<4; ++i){
			for (j = 0; j<2; ++j){
				for (k = 0; k<(int)(2.*(ifrm2 - ifrm1) / PRF2) + 1; ++k){
					gsline(Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 20 + 100 * i + 82 * j,
						My_ini - (int)(300.*PRF2 / (ifrm2 - ifrm1)*k),
						Mx_ini + (int)(izoom_M*ncount*deltad / mpp) + 20 + 8 + 100 * i + 82 * j,
						My_ini - (int)(300.*PRF2 / (ifrm2 - ifrm1)*k), gscolor);
				}
			}
		}
		/* *************************************************************************
		Display ECG
		********************************************************************** */
		ry0 = 600. / nframe; rx0 = 35. / ecgmax;
		for (i = 0; i<nframe - 2; ++i){
			nx0 = (int)(izoom_M*ncount*deltad / mpp) + 20 + 45;
			gsline(Mx_ini + nx0 - (int)(rx0*ecg[i]),
				My_ini - (int)(ry0*i),
				Mx_ini + nx0 - (int)(rx0*ecg[i + 1]),
				My_ini - (int)(ry0*(i + 1)), gscolor);
		}
		/* *************************************************************************
		Display Timing of R-wave
		********************************************************************** */
		if (nbeat != 0){
			nbeat2 = nbeat;
			for (i = 0; i<nbeat; ++i){
				if (track0[i]>0){
					nbeat1 = i;
					break;
				}
			}
			for (i = 0; i<nbeat; ++i){
				if (track0[i]>nframe){
					nbeat2 = i - 1;
					break;
				}
			}
			if (nbeat1 == 0) nbeat1 = 0;
			if (nbeat2 == 0) nbeat2 = 0;
			gscolor = gscol256(255, 0, 0);
			nx0 = (int)(izoom_M*ncount*deltad / mpp);
			for (i = nbeat1; i<nbeat2; ++i){
				gsline_d(Mx_ini, My_ini - (int)(ry0*track0[i]),
					Mx_ini + nx0, My_ini - (int)(ry0*track0[i]), gscolor);
			}
			nx0 = (int)(izoom_M*ncount*deltad / mpp) + 30;
			for (i = 0; i<4; ++i){
				for (j = nbeat1; j<nbeat2; ++j){
					gsline_d(Mx_ini + nx0 + 100 * i, My_ini - (int)(ry0*track0[j]),
						Mx_ini + nx0 + 70 + 100 * i, My_ini - (int)(ry0*track0[j]), gscolor);
				}
			}
			gscolor = gscol256(0, 0, 0);
		}

		/* *************************************************************************
		Display PCG
		********************************************************************** */
		/*ry0=600./nframe; rx0=35./pcgmax;
		for(i=0;i<nframe-1;++i){
		nx0=(int)(izoom_M*ncount*deltad/mpp)+20+145;
		gsline(Mx_ini+nx0-(int)(rx0*pcg[i]),
		My_ini+(int)(ry0*i),
		Mx_ini+nx0-(int)(rx0*pcg[i+1]),
		My_ini+(int)(ry0*(i+1)));
		}*/

		/* *************************************************************************
		Start of Loop for Frame for Displacement Estimation
		********************************************************************** */
		for (idcnt = 0; idcnt<ndep[iiposi]; ++idcnt){
			disp[idcnt][ifrm1] = 0.0;
			dd[ifrm1] = 0.0;
		}
		ip1 = 0; ip2 = ncount;


		for (ifrm = ifrm1; ifrm<ifrm2; ++ifrm){

			/* Quadrature Demodulation */
			czeros = cmplx(0.0, 0.0);
			for (i = -1; i<2; ++i){
				if (iiposi + i>-1 && iiposi + i<nposi){
					/* For Previous Frame */
					if (ifrm == ifrm1){
						for (j = ip1; j<ip2; ++j){
							qdr_p[j][i + 1] = 0.0; qdi_p[j][i + 1] = 0.0; icnt = 0;
							for (k = -nDFT / 2; k < nDFT / 2; ++k) {
								if (j + k >= 0 && j + k<ncount){
									qdr_p[j][i + 1] = qdr_p[j][i + 1] + han_w[k + nDFT / 2] *
										cos(nfrq*rad*(k + nDFT / 2) / (float)nDFT)*
										(float)raw_dat[ihof[iiposi + i][ifrm] + j + k];
									qdi_p[j][i + 1] = qdi_p[j][i + 1] - han_w[k + nDFT / 2] *
										sin(nfrq*rad*(k + nDFT / 2) / (float)nDFT)*
										(float)raw_dat[ihof[iiposi + i][ifrm] + j + k];
									++icnt;
								}
							}
							qdr_p[j][i + 1] = qdr_p[j][i + 1] / (float)icnt;
							qdi_p[j][i + 1] = qdi_p[j][i + 1] / (float)icnt;
						}
					}
					/* For Post-Frame */
					for (j = ip1; j<ip2; ++j){
						qdr_f[j][i + 1] = 0.0; qdi_f[j][i + 1] = 0.0; icnt = 0;
						for (k = -nDFT / 2; k<nDFT / 2; ++k){
							if (j + k >= 0 && j + k<ncount){
								qdr_f[j][i + 1] = qdr_f[j][i + 1] + han_w[k + nDFT / 2] *
									cos(nfrq*rad*(k + nDFT / 2) / (float)nDFT)*
									(float)raw_dat[ihof[iiposi + i][ifrm + 1] + j + k];
								qdi_f[j][i + 1] = qdi_f[j][i + 1] - han_w[k + nDFT / 2] *
									sin(nfrq*rad*(k + nDFT / 2) / (float)nDFT)*
									(float)raw_dat[ihof[iiposi + i][ifrm + 1] + j + k];
								++icnt;
							}
						}
						qdr_f[j][i + 1] = qdr_f[j][i + 1] / (float)icnt;
						qdi_f[j][i + 1] = qdi_f[j][i + 1] / (float)icnt;
					}
				}
			}
			/* Start of Loop of Depth for Displacement Estimation */
			for (idcnt = 0; idcnt<ndep[iiposi]; ++idcnt){
				if (ifrm == ifrm1){
					if (idcnt == 0) peak0[idcnt] = ipeak11[iiposi];
					if (idcnt == 1) peak0[idcnt] = ipeak22[iiposi];
				}
				xpeak0[idcnt] = (float)peak0[idcnt];
				// velocity estimation
				crr0 = czeros; crr1 = czeros;
				for (ispc = -nspc; ispc<nspc + 1; ++ispc){
					if (iiposi + ispc >= 0 && iiposi + ispc<nposi){
						for (i = 0; i <= 2 * idltx; ++i){
							if (i + peak0[idcnt] >= 0 && i + peak0[idcnt]<ncount){
								rr = qdr_p[i + peak0[idcnt]][ispc + 1];
								ri = qdi_p[i + peak0[idcnt]][ispc + 1];
								cdmyp = cmplx(rr, ri);
								rr = qdr_f[i + peak0[idcnt]][ispc + 1];
								ri = qdi_f[i + peak0[idcnt]][ispc + 1];
								cdmy = cmplx(rr, ri);
								ctemp = conjg(cdmyp);
								crr0 = cadd(crr0, cmul(cdmy, ctemp));
							}
						}
					}
				}
				vel_p[idcnt] = vel[idcnt];
				if (ifrm == ifrm1) vel_p[idcnt] = 0.0;
				vel[idcnt] = -0.5*c0*atan2(crr0.i, crr0.r) / rad / f0;

				disp[idcnt][ifrm + 1] = disp[idcnt][ifrm] + vel[idcnt];
				if (idcnt == 0){
					xpeak0[idcnt] = ipeak11[iiposi] + disp[idcnt][ifrm + 1] / deltad;
				}
				if (idcnt == 1){
					xpeak0[idcnt] = ipeak22[iiposi] + disp[idcnt][ifrm + 1] / deltad;
				}
				peak0[idcnt] = (int)xpeak0[idcnt];
			}
			dd[ifrm + 1] = disp[1][ifrm + 1] - disp[0][ifrm + 1];

			ry0 = 600. / nframe;
			for (idcnt = 0; idcnt<ndep[iiposi]; ++idcnt){
				/* Display Tracked Position */
				gscolor = gscol256(255, 0, 0);
				if (ifrm >= ifrm1 && ifrm<ifrm2)
					gsline(Mx_ini + (int)(izoom_M*peak0[idcnt] * deltad / mpp),
					My_ini - (int)(ry0*ifrm),
					Mx_ini + (int)(izoom_M*peak0[idcnt] * deltad / mpp),
					My_ini - (int)(ry0*(ifrm + 1)), gscolor);
				gscolor = gscol256(255, 255, 255);
				gsline(Mx_ini + 1 + (int)(izoom_M*peak0[idcnt] * deltad / mpp),
					My_ini - (int)(ry0*ifrm),
					Mx_ini + 1 + (int)(izoom_M*peak0[idcnt] * deltad / mpp),
					My_ini - (int)(ry0*(ifrm + 1)), gscolor);
				gscolor = gscol256(0, 0, 0);
				/* Display Velocity */
				rx0 = 35. / rryy;
				if (idcnt == 0) nx0 = (int)(izoom_M*ncount*deltad / mpp) + 20 + 145;
				if (idcnt == 1) nx0 = (int)(izoom_M*ncount*deltad / mpp) + 20 + 245;

				if (ifrm > ifrm1 && ifrm < ifrm2 - 1) {
					gsline(Mx_ini + nx0 + (int)(rx0*vel_p[idcnt] * PRF2),
						My_ini - (int)(ry0*ifrm),
						Mx_ini + nx0 + (int)(rx0*vel[idcnt] * PRF2),
						My_ini - (int)(ry0*(ifrm + 1)), gscolor);
				}
			}

			/* Display Change in Diameter */
			rx0 = 35. / rmaxdh;
			nx0 = (int)(izoom_M*ncount*deltad / mpp) + 20 + 345;
			if (ifrm >= ifrm1 && ifrm<ifrm2 - 1){
				gsline(Mx_ini + nx0 - (int)(rx0*dd[ifrm]),
					My_ini - (int)(ry0*ifrm),
					Mx_ini + nx0 - (int)(rx0*dd[ifrm + 1]),
					My_ini - (int)(ry0*(ifrm + 1)), gscolor);
			}


			for (i = 0; i<3; ++i){
				for (j = 0; j<ncount; ++j){
					qdr_p[j][i] = qdr_f[j][i]; qdi_p[j][i] = qdi_f[j][i];
				}
			}
			if (ddmax>dd[ifrm + 1])
				ddmax = dd[ifrm + 1];

		} // end of loop of frame
		sprintf(buf, "import -window 0x%x -silent ./images/%s/Mmode/pos%d.gif", wid, fname, iiposi);
		//system(buf);

		fprintf(fin, "%d %f\n", iiposi, ddmax*1e+6);

	} // end of loop of beam position
	fclose(fin);
	/* *************************************************************************
	Terminate Program
	********************************************************************** */
	free(raw_dat); free(sgn); free(dmy);
	end();
	printf("INPUT 0 for termination of program.\n");
	scanf("%d", &iflg);
	printf("*******************************\n");
	printf("*     normally terminated     *\n");
	printf("*******************************\n");
}
Ejemplo n.º 6
0
void cds_ccf ( VG_DBStruct *el, int indx, int *iret )
/************************************************************************
 * cds_ccf								*
 *									*
 * This function displays CCFs to the output device.			*
 *									*
 * cds_ccf (el, indx, iret)						*
 *									*
 * Input parameters:							*
 * 	*el		VG_DBStruct	Pointer to VG record structure	*
 *	indx		int		Index into user attribute table *
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *									*
 **									*
 * Log:									*
 * D.W.Plummer/NCEP	 7/99	Copied from cds_sig			*
 * S. Law/GSC		02/00	added smoothing				*
 * S. Law/GSC		05/00	added fill, moved color setting to pgen	*
 * A. Hardy/GSC         11/00   renamed output coord. system declaration*
 * J. Wu/GSC            02/01   Modified 'unused1' in VG to 'smooth'	*
 * D.W.Plummer/NCEP	 5/01	Added check for cdsColor		*
 * M. Li/SAIC		01/03	delete vgstruct.h			*
 * H. Zeng/SAIC		02/05	assigned iftyp with a new value		*
 * L. Hinson/AWC        07/09   Add Setting/Uattrib tbl functionality   *
 *                              Add Connector, if needed, from text box *
 *                              to polygon.  Add motion vector/speed    *
 * L. Hinson/AWC        02/10   Fix uninitialized 'ifilled' on Lines    *
 ***********************************************************************/
{
    int		ii, np, ier, istyp, width, lintyp, lthw, lwhw;
    int         iltypx, ilthwx, iwidthx, iwhwx, icolrx, iftypx;
    int		ifilled, iftyp;
    float	szfilx, szfil, lat[MAX_SIGMET], lon[MAX_SIGMET];
    int idx;
    VG_DBStruct el_tmp;
    CCFType	*pccf;
    
    int npts, npls, *inout;
    float *xpt, *ypt, *xpl, *ypl;
    
    float areadir, areaspd, xcent, ycent, minangle, V1x, V1y, V2u, V2v;
    float angle, latmv[2], lonmv[2];
    int i, motionvertexnum, foundmotionvertex;
    char    textLayoutStr[256];
    Boolean textLayoutNIL = False;
    
/*---------------------------------------------------------------------*/

    *iret = 0;

    /*
     *  Save plot attributes.
     */
    gqcolr (&icolrx, &ier);
    gqline (&iltypx, &ilthwx, &iwidthx, &iwhwx, &ier);
    gqfill (&szfilx, &iftypx, &ier);
   
    /*
     * setup basic information
     */
    lintyp = 1;
    lthw  = 0;
    width = 3;
    lwhw  = 0;
    gsline (&lintyp, &lthw, &width, &lwhw, &ier);
    
    pccf  = &(el->elem.ccf);
    np    = pccf->info.npts;
    /*
     * Set the color for the feature.
     */
    if (cdsColor == 0) {
      if ( cdsUattr[indx].maj_col == 0 ) {
        if (pccf->info.prob == (CCFLVL_HIGH + 1)) { /*1 = High, 2= Low */
          gscolr ( &(el->hdr.maj_col), &ier);
	}
	else {
          gscolr ( &(el->hdr.min_col), &ier);
	}
      }
      else {
        /* Use the Uattrib table */
        if (pccf->info.prob == (CCFLVL_HIGH + 1)) {
          gscolr ( &cdsUattr[indx].maj_col, &ier);
          el->hdr.maj_col = cdsUattr[indx].maj_col; /* Colors everything else */
        } else {
          gscolr ( &cdsUattr[indx].min_col, &ier);
          el->hdr.maj_col = cdsUattr[indx].min_col;  /* Colors everything else */
        }
      }
    } else {
      gscolr ( &cdsColor, &ier);
    }

    /*
     *  Set the smoothing level_tmp
     */
    ii = (cdsUattr[indx].smooth == -1) ?
	 (int) el->hdr.smooth : cdsUattr[indx].smooth;
    istyp = (ii == 0) ? 0 : 2;
    gssmth (&istyp, &cdsSmthDens[ii], &ier);

    /*
     * If fill is set, fill the polygon.
     */
    ifilled=0;
    if (cdsUattr[indx].filled == 0) {
      ifilled = (int) el->hdr.filled;
    } else {
      if (pccf->info.subtype == SIGTYP_AREA) {      
        if (pccf->info.cover == CCFLVL_HIGH + 1) {
          ifilled =  cdsUattr[indx].info.ccf->fillhi;
        }
        if (pccf->info.cover == CCFLVL_MEDIUM + 1) {
          ifilled = cdsUattr[indx].info.ccf->fillmed;
        }
        if (pccf->info.cover == CCFLVL_LOW + 1) {
          ifilled = cdsUattr[indx].info.ccf->filllow;
        }
      }
    }
    
    if (ifilled >= 1 && cdsFill == 1) {
	iftyp = ifilled;
	szfil = 1.0F;
	gsfill (&szfil, &iftyp, &ier);

	gfill (sys_M, &np, pccf->latlon, &(pccf->latlon[np]),
	       &ier, strlen (sys_M));

	iftyp = 1;
	gsfill (&szfil, &iftyp, &ier);
    }
    
    if (cdsUattr[indx].info.ccf->linetype == 0) {
      lintyp = el->elem.ccf.info.linetype;
    } else {
      lintyp = cdsUattr[indx].info.ccf->linetype;
    }
        
    switch (pccf->info.subtype)  {

      case	SIGTYP_LINE_HIGH:		/* line		*/
        gsline (&lintyp, &lthw, &width, &lwhw, &ier);
	for (ii = 0; ii < np; ii++)  {
	    lat[ii] = pccf->latlon[ii];
	    lon[ii] = pccf->latlon[ii+np];
	}

	gline (sys_M, &np, lat, lon, &ier, strlen (sys_M));

	break;

      case      SIGTYP_LINE_MED:               /* line         */
        gsline (&lintyp, &lthw, &width, &lwhw, &ier);
        for (ii = 0; ii < np; ii++)  {
	    lat[ii] = pccf->latlon[ii];
	    lon[ii] = pccf->latlon[ii+np];
	}

	gline (sys_M, &np, lat, lon, &ier, strlen (sys_M));

        break;
        
      case	SIGTYP_AREA:		/* area		*/
        gsline (&lintyp, &lthw, &width, &lwhw, &ier);

	for ( ii = 0; ii < np; ii++ )  {
	    lat[ii] = pccf->latlon[ii];
	    lon[ii] = pccf->latlon[ii+np];
	}
	lat[np] = pccf->latlon[0];
	lon[np] = pccf->latlon[np];
	np++;

	gline (sys_M, &np, lat, lon, &ier, strlen (sys_M));

	break;

    }
    
    /* Check to see if textLayoutString for CCF Text contains NIL */
    /* If so, set the variable textLayoutNIL to TRUE. */
    
    if ( cdsUattr[indx].info.ccf->textLayout[0] == '\0' ) {
      strcpy(textLayoutStr, el->elem.ccf.textLayout);
    } else {
      strcpy(textLayoutStr, cdsUattr[indx].info.ccf->textLayout);
    }
    if (strstr(textLayoutStr, "NIL") != NULL) {
      textLayoutNIL = True;
    }

    /*
     * Reset smooth level to 0
     */
    if (istyp > 0) {
	istyp = 0;
	gssmth (&istyp, &cdsSmthDens[0], &ier);
    }
    
    /*
     *  Restore the saved plot attribute values
     */
    gsline ( &iltypx, &ilthwx, &iwidthx, &iwhwx, &ier );
    gscolr ( &icolrx, &ier );
    gsfill (&szfilx, &iftypx, &ier);
        
    if (! (pccf->info.subtype == SIGTYP_LINE_HIGH || pccf->info.subtype == SIGTYP_LINE_MED)) {
      /* Create an arrow if the text box is outside the CCF polygon*/
      cds_getinx( el, &idx, &ier);  /* Get the idx to the arrow size */
      npts = 1;
      G_MALLOC( xpt, float, npts, "cds_ccf: xpt" );
      G_MALLOC( ypt, float, npts, "cds_ccf: ypt" );
      G_MALLOC( inout, int, npts, "cds_ccf: inout" );
      xpt[0] = el->elem.ccf.info.textlat;
      ypt[0] = el->elem.ccf.info.textlon;
      npls = el->elem.ccf.info.npts;
      G_MALLOC( xpl, float, npls, "cds_ccf: xpl" );
      G_MALLOC( ypl, float, npls, "cds_ccf: ypl" );
      for ( ii = 0; ii < npls; ii++ ) {
          xpl[ii] = el->elem.ccf.latlon[ii];
          ypl[ii] = el->elem.ccf.latlon[ii+npls];
      }
      cgr_inpoly ( sys_M, &npts, xpt, ypt, sys_M, &npls, xpl, ypl, inout, &ier );
      /*
       * If the center of the text box is outside of GFA polygon, and TextLayoutNIL
       * not set display an arrowed line.
       */
      if ( inout[0] == 0  && textLayoutNIL == False) {
        el_tmp.hdr.delete   = 0;
        el_tmp.hdr.vg_type  = SPLN_ELM;
        el_tmp.hdr.vg_class = (char)CLASS_LINES;
        el_tmp.hdr.filled   = 0;
        el_tmp.hdr.closed   = 0;
        el_tmp.hdr.smooth   = 0;
        el_tmp.hdr.version  = 0;
        el_tmp.hdr.grptyp   = 0;
        el_tmp.hdr.grpnum   = 0;
        el_tmp.hdr.maj_col  = el->hdr.maj_col;
        el_tmp.hdr.min_col  = el->hdr.min_col;
        el_tmp.hdr.recsz    = 0;
        el_tmp.hdr.range_min_lat = 0;
        el_tmp.hdr.range_min_lon = 0;
        el_tmp.hdr.range_max_lat = 0;
        el_tmp.hdr.range_max_lon = 0;

        el_tmp.elem.spl.info.numpts = 2;
        el_tmp.elem.spl.info.spltyp = 4;
        el_tmp.elem.spl.info.splstr = 0.5;
        el_tmp.elem.spl.info.spldir = 1;
        el_tmp.elem.spl.info.splsiz = 1.0;
        el_tmp.elem.spl.info.splsiz = el->elem.ccf.info.szarrow;
        /* Set the Arrow Size from the settings table... */
        if ( fabs (cdsUattr[idx].info.ccf->szarrow < 0.01) ) {
          el_tmp.elem.spl.info.splsiz = el->elem.ccf.info.szarrow;
        } else {
          el_tmp.elem.spl.info.splsiz = cdsUattr[idx].info.ccf->szarrow;
        }
                        
        el_tmp.elem.spl.latlon[0] = el->elem.ccf.info.textlat;
        el_tmp.elem.spl.latlon[1] = el->elem.ccf.info.arrowlat;
        el_tmp.elem.spl.latlon[2] = el->elem.ccf.info.textlon;
        el_tmp.elem.spl.latlon[3] = el->elem.ccf.info.arrowlon;
        el_tmp.elem.spl.info.splwid = 3;
        el_tmp.hdr.maj_col = el_tmp.hdr.min_col = 31;        
        cds_dspelm(&el_tmp, &ier);
        el_tmp.elem.spl.info.splwid = 1;
        el_tmp.hdr.maj_col = el_tmp.hdr.min_col = 32;
        cds_dspelm(&el_tmp, &ier);

      }
Ejemplo n.º 7
0
void cds_sig ( VG_DBStruct *el, int indx, int *iret )
/************************************************************************
 * cds_sig								*
 *									*
 * This function displays SIGMETs to the output device.			*
 *									*
 * cds_sig (el, indx, iret)						*
 *									*
 * Input parameters:							*
 * 	*el		VG_DBStruct	Pointer to VG record structure	*
 *	indx		int		Index into user attribute table *
 *									*
 * Output parameters:							*
 *	*iret		int		Return code			*
 *									*
 **									*
 * Log:									*
 * D.W.Plummer/NCEP	 7/99	Copied from cds_line			*
 * D.W.Plummer/NCEP	 9/99	Compute circle from element distance;	*
 *				Compute line extension area		*
 * H. Zeng/EAI           9/99   Preserve plot attributes                *
 * F. J. Yen/NCEP 	10/99   Handled user attribute table            *
 * M. Li/GSC		10/99	Modified clo_direct and clo_dltln codes	*
 * D.W.Plummer/NCEP	12/99	Added plotting of sequence number	*
 * M. Li/GSC		 1/00	Used string variables in gtrans		*
 * S. Law/GSC		05/00	changed to use MAX_SIGMET for lat/lon	*
 * H. Zeng/EAI          06/00   increased the sizes of lat&lon arrays   *
 * A. Hardy/GSC         11/00   renamed coordinate system declarations	*
 * M. Li/SAIC           01/03   delete vgstruct.h                       *
 * T. Piper/SAIC        12/05   redone with new Setting_t structure     *
 ***********************************************************************/
{
    int		ii, kk, npts, np, intrsct, ier;
    int		mtype, color, width, lintyp, lthw, lwhw, mkhw, two;
    int         iltypx, ilthwx, iwidthx, iwhwx, icolrx, imarkx, imkhwx, imkwidx;
    char	str[4];
    float	lat[MAX_SIGMET*2+3], lon[MAX_SIGMET*2+3];
    float	size, dist, dir, ang1, ang2;
    float	dirs[]={ 0.0F, 180.0F, 90.0F, 270.0F };
    float	s1lat[2], s1lon[2], s2lat[2], s2lon[2];
    float	x1[2], y1[2], x2[2], y2[2];
    float	xint, yint;
    float       szmarkx;
    float	lbllat, lbllon, rotat=0.0F;
    int		ixoff=0, iyoff=2;
    int		itxfn_s, itxhw_s, itxwid_s, ibrdr_s, irrotn_s, ijust_s;
    float	sztext_s;
    int		itxfn, itxhw, itxwid, ibrdr, irrotn, ijust;
    float	sztext;
    SigmetType	*psig;
/*---------------------------------------------------------------------*/

    *iret = 0;

    /*
     *  Save plot attributes.
     */
    gqcolr ( &icolrx, &ier );
    gqline ( &iltypx, &ilthwx, &iwidthx, &iwhwx, &ier );
    gqmrkr ( &imarkx, &imkhwx, &szmarkx, &imkwidx, &ier );
   
    /*
     * setup basic information
     */
    psig  = &(el->elem.sig);
    width =  (int) (( (  cdsUattr[indx].info.sig->linwid == 0 ) ?
		(float)psig->info.linwid :
		(float)cdsUattr[indx].info.sig->linwid) * cdsLineWdth);
    lintyp = (  cdsUattr[indx].info.sig->lintyp == 0 ) ?
		psig->info.lintyp : cdsUattr[indx].info.sig->lintyp;

    lthw  = 0;
    lwhw  = 0;
    mtype = 1;
    mkhw  = 0;
    size  = 1.0F;
    np    = psig->info.npts;

    gsline (&lintyp, &lthw, &width, &lwhw, &ier);

    color = (cdsColor == 0) ? 
       	 ( ( cdsUattr[indx].maj_col == 0 ) ?
	     el->hdr.maj_col : cdsUattr[indx].maj_col ) : cdsColor;
    gscolr (&color, &ier);

    switch ( psig->info.subtype )  {

      case	SIGTYP_ISOL:		/* isolated	*/

	/*
	 *  Plot marker w/ surrounding circle
	 */

        lat[0] = psig->latlon[0];
        lon[0] = psig->latlon[np];
        gsmrkr ( &mtype, &mkhw, &size, &width, &ier );
        gmark ( sys_M, &np, lat, lon, &ier, strlen(sys_M) );

	if ( !G_DIFF(psig->info.distance, 0.0F ) )  {

            dir = ( lat[0] >= 0.F ) ? 180.F : 0.F;
	    dist = psig->info.distance * NM2M;
	    clo_dltln ( &lat[0], &lon[0], &dist, &dir, &(lat[1]), &(lon[1]), &ier );
            np = 18;
            gcircl ( sys_M, lat, lon, &(lat[1]), &(lon[1]), &np, 
		     &ier, strlen(sys_M) );

	}

	break;

      case	SIGTYP_LINE:		/* line		*/

	for ( ii = 0; ii < np; ii++ )  {
	    lat[ii] = psig->latlon[ii];
	    lon[ii] = psig->latlon[ii+np];
	}

	gline ( sys_M, &np, lat, lon, &ier, strlen(sys_M) );

	if ( !G_DIFF(psig->info.distance, 0.0F) )  {

	    lintyp = 2;
    	    gsline (&lintyp, &lthw, &width, &lwhw, &ier);

	    dist = psig->info.distance * NM2M;

	    switch ( psig->info.sol )  {

		case	SIGLINE_NOF:
		case	SIGLINE_SOF:
		case	SIGLINE_EOF:
		case	SIGLINE_WOF:

		    npts = 1;
		    for ( ii = 0; ii < np; ii++ )  {
			clo_dltln ( &(psig->latlon[ii]), &(psig->latlon[ii+np]),
				    &dist, &(dirs[psig->info.sol-1]),
				    &(lat[npts]), &(lon[npts]), &ier );
			npts++;
		    }
		    lat[npts] = psig->latlon[np-1];
		    lon[npts] = psig->latlon[2*np-1];
		    npts++;

		    gline ( sys_M, &npts, lat, lon, &ier, strlen(sys_M) );

		break;

		case	SIGLINE_ESOL:

		    lat[0] = psig->latlon[0];
		    lon[0] = psig->latlon[np];

		    clo_direct ( &(psig->latlon[1]), &(psig->latlon[np+1]),
				 &(psig->latlon[0]), &(psig->latlon[np  ]),
				 &ang1, &ier );

		    ang1 -= 90.0F;
		    clo_dltln ( &(psig->latlon[0]), &(psig->latlon[np]), &dist, 
				&ang1, &(lat[2*np+1]), &(lon[2*np+1]), &ier );
		    ang1 = ang1 - 180.0F;
		    clo_dltln ( &(psig->latlon[0]), &(psig->latlon[np]), &dist, 
				&ang1, &(lat[1]), &(lon[1]), &ier );

		    ang2 = ang1;

		    two = 2;
		    for ( ii = 1; ii < np-1; ii++ )  {

		     clo_direct ( &(psig->latlon[ii-1]), &(psig->latlon[np+ii-1]),
				  &(psig->latlon[ii]), &(psig->latlon[np+ii]), 
				  &ang1, &ier );
		     ang1 = (float)fmod ( ((double)ang1+270.0), 360.0);
		     clo_dltln ( &(psig->latlon[ii]), &(psig->latlon[np+ii]), 
				 &dist, &ang1, &(s1lat[1]), &(s1lon[1]), &ier );
		     clo_direct ( &(psig->latlon[ii+1]), &(psig->latlon[np+ii+1]),
				  &(psig->latlon[ii]), &(psig->latlon[np+ii]),
				  &ang2, &ier );
		     ang2 = (float)fmod ( ((double)ang2+90.0), 360.0);
		     clo_dltln ( &(psig->latlon[ii]), &(psig->latlon[np+ii]), 
				 &dist, &ang2, &(s2lat[0]), &(s2lon[0]), &ier );

		     if ( G_ABS(ang1-ang2) > 1.F )  {

		       clo_dltln ( &(psig->latlon[ii-1]), &(psig->latlon[np+ii-1]), 
				   &dist, &ang1, &(s1lat[0]), &(s1lon[0]), &ier );
		       clo_dltln ( &(psig->latlon[ii+1]), &(psig->latlon[np+ii+1]), 
				   &dist, &ang2, &(s2lat[1]), &(s2lon[1]), &ier );

		       gtrans ( sys_M, sys_N, &two, s1lat, s1lon, x1, y1, 
		                &ier, strlen(sys_M), strlen(sys_N) );
		       gtrans ( sys_M, sys_N, &two, s2lat, s2lon, x2, y2, 
		                &ier, strlen(sys_M), strlen(sys_N) );
		       cgr_segint( sys_N, x1, y1, sys_N, x2, y2,
			           sys_M, &xint, &yint, &intrsct, &ier );

		     }
		     else  {

		       xint = (s1lat[1] + s2lat[0]) / 2.0F;
		       yint = (s1lon[1] + s2lon[0]) / 2.0F;

		     }

		     kk = ii + 1;
		     lat[kk] = xint;
		     lon[kk] = yint;

		     ang1 = (float)fmod ( ((double)ang1+180.0), 360.0 );
		     ang2 = (float)fmod ( ((double)ang2+180.0), 360.0 );

		     clo_dltln ( &(psig->latlon[ii]), &(psig->latlon[np+ii]), 
				 &dist, &ang1, &(s1lat[1]), &(s1lon[1]), &ier );
		     clo_dltln ( &(psig->latlon[ii]), &(psig->latlon[np+ii]), 
				 &dist, &ang2, &(s2lat[0]), &(s2lon[0]), &ier );

		     if ( G_ABS(ang1-ang2) > 1.F )  {

		       clo_dltln ( &(psig->latlon[ii-1]), &(psig->latlon[np+ii-1]), 
				   &dist, &ang1, &(s1lat[0]), &(s1lon[0]), &ier );
		       clo_dltln ( &(psig->latlon[ii+1]), &(psig->latlon[np+ii+1]), 
				   &dist, &ang2, &(s2lat[1]), &(s2lon[1]), &ier );

		       gtrans ( sys_M, sys_N, &two, s1lat, s1lon, x1, y1, 
		                &ier, strlen(sys_M), strlen(sys_N) );
		       gtrans ( sys_M, sys_N, &two, s2lat, s2lon, x2, y2, 
		                &ier, strlen(sys_M), strlen(sys_N) );
		       cgr_segint( sys_N, x1, y1, sys_N, x2, y2,
			           sys_M, &xint, &yint, &intrsct, &ier );

		     }
		     else  {

		       xint = (s1lat[1] + s2lat[0]) / 2.0F;
		       yint = (s1lon[1] + s2lon[0]) / 2.0F;

		     }

		     kk = 2*np - ii + 1;
		     lat[kk] = xint;
		     lon[kk] = yint;

		     ang1 = (float)fmod ( ((double)ang1+180.0), 360.0 );
		     ang2 = (float)fmod ( ((double)ang2+180.0), 360.0 );

		     ang1 = ang2;

		    }

		    clo_direct ( &(psig->latlon[np-2]), &(psig->latlon[2*np-2]),
				 &(psig->latlon[np-1]), &(psig->latlon[2*np-1]),
				 &ang2, &ier );

		    ang2 -= 90.0F;
		    clo_dltln ( &(psig->latlon[np-1]), &(psig->latlon[2*np-1]), 
				&dist, &ang2, &(lat[np]), &(lon[np]), &ier );

		    ang2 = (float)fmod ( ((double)ang2+180.0), 360.0);
		    clo_dltln ( &(psig->latlon[np-1]), &(psig->latlon[2*np-1]), 
				&dist, &ang2, &(lat[np+2]), &(lon[np+2]), &ier );

		    lat[np+1] = psig->latlon[np-1];
		    lon[np+1] = psig->latlon[2*np-1];

		    lat[2*np+2] = lat[0];
		    lon[2*np+2] = lon[0];

		    npts = 2*np + 3;
		    gline ( sys_M, &npts, lat, lon, &ier, strlen(sys_M) );

		break;

	    }

	}

	break;

      case	SIGTYP_AREA:		/* area		*/

	for ( ii = 0; ii < np; ii++ )  {
	    lat[ii] = psig->latlon[ii];
	    lon[ii] = psig->latlon[ii+np];
	}
	lat[np] = psig->latlon[0];
	lon[np] = psig->latlon[np];
	np++;

	gline ( sys_M, &np, lat, lon, &ier, strlen(sys_M) );

	break;

    }

    if ( el->hdr.vg_type == SIGCONV_ELM || el->hdr.vg_type == SIGOUTL_ELM )  {

	if ( el->hdr.vg_type == SIGCONV_ELM ) 
	    sprintf( str, "%d%c", psig->info.seqnum, psig->info.msgid[0] );
	else if ( el->hdr.vg_type == SIGOUTL_ELM )
	    sprintf( str, "%d", psig->info.seqnum );

	np = psig->info.npts;
	lbllat = psig->latlon[0];
	lbllon = psig->latlon[np];
	for ( ii = 1; ii < np; ii++ )  {
	    if ( psig->latlon[ii] > lbllat )  {
	        lbllat = psig->latlon[ii];
	        lbllon = psig->latlon[ii+np];
	    }
	}

	gqtext( &itxfn_s, &itxhw_s, &sztext_s, &itxwid_s, &ibrdr_s, 
		&irrotn_s, &ijust_s, &ier );
	itxfn  = 0;
	itxhw  = 0;
	sztext = 1.5F;
	itxwid = 0;
	ibrdr  = 0;
	irrotn = 0;
	ijust  = 2;
	gstext( &itxfn, &itxhw, &sztext, &itxwid, &ibrdr, &irrotn, &ijust, &ier );
	gtext( sys_M, &lbllat, &lbllon, str, &rotat, &ixoff, &iyoff, &ier, 
	       strlen(sys_M), strlen(str) );
	gstext( &itxfn_s, &itxhw_s, &sztext_s, &itxwid_s, &ibrdr_s, 
		&irrotn_s, &ijust_s, &ier );

    }

    /*
     *  Restore the saved plot attribute values
     */
    gsmrkr ( &imarkx, &imkhwx, &szmarkx, &imkwidx, &ier );
    gsline ( &iltypx, &ilthwx, &iwidthx, &iwhwx, &ier );
    gscolr ( &icolrx, &ier );

}