awips2/ncep/gov.noaa.nws.ncep.ui.nsharp/AwcNsharp/xwvid5.c
Steve Harris 676ea3192f 12.5.1-15 baseline
Former-commit-id: b13cbb7e00 [formerly 4909e0dd166e43c22a34d96aa744f51db8a7d6c0]
Former-commit-id: 3904c4ccf5
2012-06-08 13:39:48 -05:00

760 lines
22 KiB
C

/***************************************************************/
/* SHARP-95 */
/* Advanced Interactive Sounding Analysis Program */
/* */
/* DOS Video Graphics Routines (Part #5) */
/* Inset graphic display routines. */
/* */
/* John A. Hart */
/* National Severe Storms Forecast Center */
/* Kansas City, Missouri */
/* -------------------------------------------------- */
/* List of Routines in this module: */
/* */
/* INSET_OPTIONS */
/* VISUAL1 */
/* PLOT_VIS */
/* VIS_XY */
/* WRITE_VIS_DATA */
/* DRAW_HOINSET */
/* DRAW_SKINSET */
/* PLOT_STORMINFLOW */
/* */
/***************************************************************/
#define VIDEO
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <sharp95.h>
#include <xwcmn.h>
short sk_mode = 0;
short ho_mode = 0;
/*NP*/
void inset_options( short mode )
/*************************************************************/
/* INSET_OPTIONS */
/* John Hart NSSFC KCMO */
/* */
/* Allows the user to select which inset graphic that */
/* will be displayed. */
/*************************************************************/
{
if(mode == 1)
{
/* ----- This is a SkewT ----- */
sk_mode++;
if( sk_mode > 1 ) {sk_mode = 0; }
redraw_graph(1);
}
else
{
/* ----- This is a Hodograph ----- */
ho_mode++;
if( ho_mode > 3 ) {ho_mode = 0; }
redraw_graph(2);
}
}
/*NP*/
float visual1( float lower, float upper, float pres, float temp, float dwpt)
/*************************************************************/
/* VISUAL1 */
/* John Hart NSSFC KCMO */
/* */
/* Lifts specified parcel, given an initial 5 m/s push. */
/* parcel trajectory is then calculated, using strict */
/* parcel theory. Updraft size is assumed 1km dia. */
/* */
/* All calculations use the virtual temperature correction. */
/* */
/* lower = Bottom level of layer (mb) [ -1=SFC] */
/* upper = Top level of layer (mb) [ -1=TOP] */
/* pres = LPL pressure (mb) */
/* temp = LPL temperature (c) */
/* dwpt = LPL dew point (c) */
/*************************************************************/
{
short i, lptr, uptr;
float te1, pe1, te2, pe2, h1, h2, lyre, tdef1, tdef2, totp, totn;
float te3, pe3, h3, tp1, tp2, tp3, tdef3, lyrf, lyrlast, pelast;
float tote, totx, ls1, dh, restim, uvv, tpx, ix1, ix2, tottim;
float u, v, du, dv, tsu, tsv, tdist, tangle, disp, angl;
lyre = -1;
totp = 25;
totn = 0;
tote = 0;
/* ----- See if default layer is specified ----- */
if( lower == -1) { lower = sndg[sfc()][1]; }
if( upper == -1) { upper = sndg[numlvl-1][1]; }
/* ----- Make sure this is a valid layer ----- */
if( lower > pres ) { lower = pres; }
if( !qc( i_vtmp( upper ))) { return -999; }
if( !qc( i_vtmp( lower ))) { return -999; }
/* ----- Begin with Mixing Layer (LPL-LCL) ----- */
te1 = i_vtmp( pres );
pe1 = lower;
h1 = i_hght( pe1 );
tp1 = virtemp( pres, temp, dwpt);
drylift(pres, temp, dwpt, &pe2, &tp2);
h2 = i_hght( pe2 );
te2 = i_vtmp( pe2 );
if( lower > pe2 ) { lower = pe2; }
/* ----- Find lowest observation in layer ----- */
i = 0;
while( sndg[i][1] > lower) { i++; }
while ( !qc(sndg[i][4]) ) { i++; }
lptr = i;
if( sndg[i][1] == lower ) { lptr++; }
/* ----- Find highest observation in layer ----- */
i=numlvl-1;
while(sndg[i][1] < upper) { i--; }
uptr = i;
if( sndg[i][1] == upper ) { uptr--; }
/* ----- Start with interpolated bottom layer ----- */
pe1 = lower;
h1 = i_hght( pe1 );
te1 = i_vtmp( pe1 );
tp1 = wetlift(pe2, tp2, pe1);
totp = 25;
totn = 0;
tsu = 0;
tsv = 0;
restim = 0;
tottim = 0;
for( i = lptr; i < numlvl; i++)
{
if( qc(sndg[i][3]) )
{
/* ----- Calculate every level that reports a temp ----- */
pe2 = sndg[i][1];
h2 = sndg[i][2];
te2 = i_vtmp( pe2 );
tp2 = wetlift(pe1, tp1, pe2);
tdef1 = (virtemp(pe1, tp1, tp1) - te1) / (te1 + 273.15);
tdef2 = (virtemp(pe2, tp2, tp2) - te2) / (te2 + 273.15);
lyrlast = lyre;
lyre = 9.8F * (tdef1 + tdef2) / 2.0F * (h2 - h1);
if( lyre > 0 ) { totp += lyre; }
else { if(pe2 > 500) { totn += lyre; } }
tote += lyre;
uvv = (float)sqrt( totp * 2 );
dh = h2 - h1;
restim = dh / uvv;
tottim += restim;
sr_wind( pe1, pe2, st_dir, st_spd, &u, &v, &ix1, &ix2);
du = kt_to_mps(u) * restim;
dv = kt_to_mps(v) * restim;
tsu -= du;
tsv += dv;
tdist = (float)sqrt((tsu*tsu) + (tsv*tsv));
tangle = angle(tsu, tsv);
pelast = pe1;
pe1 = pe2;
h1 = h2;
te1 = te2;
tp1 = tp2;
/* ----- Is this the top of given layer ----- */
if(i >= uptr)
{
pe3 = pe1;
h3 = h1;
te3 = te1;
tp3 = tp1;
lyrf = lyre;
if( lyrf > 0 )
{ totp -= lyrf; }
else
{ if(pe2 > 500) { totn -= lyrf; } }
pe2 = upper;
h2 = i_hght( pe2 );
te2 = i_vtmp( pe2 );
tp2 = wetlift(pe3, tp3, pe2);
tdef3 = (virtemp(pe3, tp3, tp3) - te3) / (te3 + 273.15);
tdef2 = (virtemp(pe2, tp2, tp2) - te2) / (te2 + 273.15);
lyrf = 9.8F * (tdef3 + tdef2) / 2.0F * (h2 - h3);
if( lyrf > 0 )
{ totp += lyrf; }
else
{ if(pe2 > 500) { totn -= lyrf; } }
if( totp == 0 ) { totn = 0; }
uvv = (float)sqrt( totp * 2 );
dh = h2 - h1;
restim = dh / uvv;
tottim += restim;
sr_wind( pe1, pe2, st_dir, st_spd, &u, &v, &ix1, &ix2);
du = kt_to_mps(u) * restim;
dv = kt_to_mps(v) * restim;
tsu -= du;
tsv += dv;
tdist = (float)sqrt((tsu*tsu) + (tsv*tsv));
tangle = angle(tsu, tsv);
vis_xy( tsu, tsv);
/* printf( "%8.2f %8.2f %8.2f %8.2f %8.2f\n", pe2, uvv, tottim, tangle, tdist); */
angl = 90 - angle( tdist, agl(h2));
write_vis_data( tottim, angl );
return 1;
}
vis_xy( tsu, tsv);
/* printf( "%8.2f %8.2f %8.2f %8.2f %8.2f\n", pe2, uvv, tottim, tangle, tdist); */
if( sndg[i][1] == 500 )
{
disp = tdist;
angl = 90 - angle( tdist, agl(sndg[i][2]));
}
}
}
}
/*NP*/
void plot_vis( void )
/*************************************************************/
/* PLOT_VIS */
/* John Hart NSSFC KCMO */
/* */
/* Plots the results of storm-relative parcel trajectory. */
/*************************************************************/
{
float sfctemp, sfcdwpt, sfcpres, ix1;
short x1, y1, x2, y2;
struct _parcel pcl;
setcliprgn( hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(0);
setlinestyle( 1, 1 );
rectangle( 1, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(1);
rectangle( 0, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
/* ----- Plot Crosshairs ----- */
setcolor(24);
moveto(hov.brx-150, hov.tly + 75); lineto(hov.brx, hov.tly+75);
moveto(hov.brx-75, hov.tly); lineto(hov.brx-75, hov.tly+150);
/* ----- Plot Label ----- */
setcolor(1);
outgtext( "Storm", hov.brx-145, hov.tly + 125 );
outgtext( "Visualization", hov.brx-145, hov.tly + 137 );
/* ----- Calculate Parcel Data ----- */
sfctemp = lplvals.temp;
sfcdwpt = lplvals.dwpt;
sfcpres = lplvals.pres;
ix1 = parcel( -1, -1, sfcpres, sfctemp, sfcdwpt, &pcl);
/* ----- Plot storm motion ----- */
x1 = hov.brx - 75;
y1 = hov.tly + 75;
x2 = (hov.brx - 75) - (short)ucomp( st_dir, 30);
y2 = (hov.tly + 75) + (short)vcomp( st_dir, 30);
setcolor(31);
moveto( x1, y1);
lineto( x2, y2);
/* ----- Run Visualization Routine ----- */
ix1 = visual1( pcl.lfcpres, pcl.elpres, sfcpres, sfctemp, sfcdwpt);
}
/*NP*/
void vis_xy( float x, float y)
/*************************************************************/
/* VIS_XY */
/* John Hart NSSFC KCMO */
/* */
/* Plots the point (x,y) on the storm visualization chart. */
/*************************************************************/
{
float xfactor, xs, ys;
xfactor=.01F;
xs = (hov.brx - 75) + (x * xfactor);
ys = (hov.tly + 75) + (y * xfactor);
/* _moveto( (short)xs, (short)ys);*/
setcolor(3);
setlinestyle (1, 1);
ellipse( 0, (short)xs-5, (short)ys-5, (short)xs+5, (short)ys+5);
}
/*NP*/
void write_vis_data( float tim, float ang )
/*************************************************************/
/* WRITE_VIS_DATA */
/* John Hart NSSFC KCMO */
/* */
/* Writes the numeric data on the storm visualization chart */
/*************************************************************/
{
short tr, tl;
char st[10], st1[5];
setcolor(31);
tr = hov.brx - 105;
tl = hov.tly + 5;
strcpy( st, qc2( tim, " s", 0 ));
disp_param( st, tr, tl);
tr = hov.brx - 5;
strcpy( st, qc2( ang, " deg", 0 ));
disp_param( st, tr, tl);
}
/*NP*/
void draw_hoinset( void )
/*************************************************************/
/* DRAW_HOINSET */
/* John Hart NSSFC KCMO */
/* */
/* Draws the hodograph inset graphic selected by the user. */
/*************************************************************/
{
switch(ho_mode)
{
case 0:
break;
case 1:
plot_vis();
break;
case 2:
plot_storminflow();
break;
case 3:
plot_vertsrw();
break;
}
XCopyArea ( XtDisplay(draw_reg), canvas, XtWindow(draw_reg),
gc, hov.brx-150, hov.tly, 150, 150,
hov.brx-150, hov.tly );
setcliprgn( 1, 1, xwdth, xhght );
}
/*NP*/
void draw_skinset( void )
/*************************************************************/
/* DRAW_SKINSET */
/* John Hart NSSFC KCMO */
/* */
/* Draws the skew-t inset graphic selected by the user. */
/*************************************************************/
{
switch(sk_mode)
{
case 0:
break;
case 1:
plot_thetae();
break;
}
}
/*NP*/
void plot_storminflow( void )
/*************************************************************/
/* PLOT_STORMINFLOW */
/* John Hart NSSFC KCMO */
/* */
/* Plots various inflow/sr wind vectors. */
/*************************************************************/
{
float sfctemp, sfcdwpt, sfcpres, ix1, ix2, ix3, ix4, ix5;
short x1, y1, x2, y2, x3, y3, i;
struct _parcel pcl;
setcliprgn( hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(0);
setlinestyle( 1, 1 );
rectangle( 1, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(1);
rectangle( 0, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(1);
moveto(hov.brx-150, hov.tly + 75); lineto(hov.brx, hov.tly+75);
moveto(hov.brx-75, hov.tly); lineto(hov.brx-75, hov.tly+150);
sfctemp = lplvals.temp;
sfcdwpt = lplvals.dwpt;
sfcpres = lplvals.pres;
/* ----- Plot speed rings ----- */
x1 = hov.brx - 75;
y1 = hov.tly + 75;
setlinestyle( 2, 1 );
setcolor(24);
for(i=20; i<=60; i+=20) { ellipse( 0, x1-i, y1-i, x1+i, y1+i); }
rectangle( 0, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
/* ----- Plot Label ----- */
setcolor(1);
outgtext( "SR Wind", hov.brx-135, hov.tly + 3 );
outgtext( "Vectors", hov.brx-135, hov.tly + 15 );
/* ----- Calculate Parcel Data ----- */
ix1 = parcel( -1, -1, sfcpres, sfctemp, sfcdwpt, &pcl);
/* ----- Plot LPL-LFC Inflow Vector ----- */
/* sr_wind( pcl.lplpres, pcl.lfcpres, st_dir, st_spd, &ix1, &ix2, &ix3, &ix4); */
/* ----- Plot 0-2km Inflow Vector ----- */
sr_wind( -1, i_pres(msl(2000)), st_dir, st_spd, &ix1, &ix2, &ix3, &ix4);
if(qc(ix3))
{
x1 = hov.brx - 75;
y1 = hov.tly + 75;
x2 = (hov.brx - 75) + (short)ix1;
y2 = (hov.tly + 75) - (short)ix2;
x3 = x2 + 1;
y3 = y2 + 1;
setlinestyle( 1, 2 );
setcolor(2);
moveto( x1, y1); lineto( x2, y2);
outgtext( "L", x3, y3 );
}
/* ----- Plot LFC-LFC+5 Inflow Vector ----- */
/* ix5 = i_pres(i_hght(pcl.lfcpres) + 5000); */
/* sr_wind( pcl.lfcpres, ix5, st_dir, st_spd, &ix1, &ix2, &ix3, &ix4); */
/* ----- Plot 4-6km Inflow Vector ----- */
sr_wind( i_pres(msl(4000)), i_pres(msl(6000)), st_dir, st_spd, &ix1, &ix2, &ix3, &ix4);
if(qc(ix3))
{
x1 = hov.brx - 75;
y1 = hov.tly + 75;
x2 = (hov.brx - 75) + (short)ix1;
y2 = (hov.tly + 75) - (short)ix2;
x3 = x2 + 1;
y3 = y2 + 1;
setcolor(6);
setlinestyle( 1, 2 );
moveto( x1, y1); lineto( x2, y2);
outgtext( "M", x3, y3 );
}
/* ----- Plot LFC+5-EL Inflow Vector ----- */
/* ix5 = i_pres(i_hght(pcl.lfcpres) + 5000); */
/* sr_wind( ix5, pcl.elpres, st_dir, st_spd, &ix1, &ix2, &ix3, &ix4); */
/* ----- Plot 9-11km Inflow Vector ----- */
sr_wind( i_pres(msl(9000)), i_pres(msl(11000)), st_dir, st_spd, &ix1, &ix2, &ix3, &ix4);
if(qc(ix3))
{
x1 = hov.brx - 75;
y1 = hov.tly + 75;
x2 = (hov.brx - 75) + (short)ix1;
y2 = (hov.tly + 75) - (short)ix2;
x3 = x2 + 1;
y3 = y2 + 1;
setcolor(7);
setlinestyle( 1, 2 );
moveto( x1, y1); lineto( x2, y2);
outgtext( "H", x3, y3 );
}
}
/*NP*/
void plot_vertsrw(void)
/*************************************************************/
/* PLOT_VERTSRW */
/* John Hart NSSFC KCMO */
/* */
/* Plots vertical profile of sr-winds (0-9km AGL) */
/*************************************************************/
{
float bothgt, tophgt, h, ix1, ix2, ix3, ix4, h1, h2;
short x1, y1, x2, y2, x3, y3, i;
char st[40];
setcliprgn( hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(0);
setlinestyle( 1, 1 );
rectangle( 1, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(1);
rectangle( 0, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
/* ----- Set Layer (AGL) ----- */
bothgt = 0;
tophgt = 16000;
/* ----- Plot Label ----- */
setcolor(1);
outgtext( "SR Winds vs", hov.brx-110, hov.tly + 3 );
outgtext( "Height", hov.brx-110, hov.tly + 15 );
/* ----- Plot height legend ----- */
setcolor(1);
for(h=bothgt; h<=tophgt; h += 2000)
{
x1 = hov.brx - 150;
y1 = vert_coords(h, tophgt);
moveto( x1, y1);
lineto(x1+5, y1);
if(h>0 && h<16000)
{
sprintf( st, "%d", (int)(h/1000));
outgtext( st, x1+5, y1-4 );
}
}
/* ----- Plot horizontal legend ----- */
setcolor(1);
for(h=0; h<=50; h += 10)
{
x1 = hov.brx - 150 + (short)(h*3);
y1 = hov.tly+150;
moveto( x1, y1);
lineto( x1, y1-5);
}
/* ----- Plot vertical dashed line at 20kt ----- */
setlinestyle(2, 1);
moveto( hov.brx - 90, hov.tly);
lineto( hov.brx - 90, hov.tly + 150);
/* ----- Plot vertical srw profile ----- */
setlinestyle(1, 2);
setcolor(2);
x2 = 999;
for(h=bothgt; h<=tophgt; h += 250)
{
sr_wind( i_pres(msl(h)), i_pres(msl(h)),
st_dir, st_spd, &ix1, &ix2, &ix3, &ix4);
x1 = hov.brx - 150 + (short)(ix4*3);
y1 = vert_coords(h, tophgt);
if(x2 == 999) { x2=x1; y2=y1; }
moveto( x1, y1);
lineto( x2, y2);
x2=x1;
y2=y1;
}
/* ----- Plot Mean-Layer SRW value (Sfc-2km) ----- */
h1 = 0;
h2 = 2000;
sr_wind( i_pres(msl(h1)), i_pres(msl(h2)),
st_dir, st_spd, &ix1, &ix2, &ix3, &ix4);
if(qc(ix4))
{
x1 = hov.brx - 150 + (short)(ix4*3);
y1 = vert_coords(h1, tophgt);
y2 = vert_coords(h2, tophgt);
setcolor(15);
moveto( x1, y1);
lineto( x1, y2);
}
/* ----- Plot Mean-Layer SRW value (2-9km) ----- */
/* h1 = 2000; */
/* h2 = 9000; */
/* ----- Plot Mean-Layer SRW value (4-6km) ----- */
h1 = 4000;
h2 = 6000;
sr_wind( i_pres(msl(h1)), i_pres(msl(h2)),
st_dir, st_spd, &ix1, &ix2, &ix3, &ix4);
if(qc(ix4))
{
x1 = hov.brx - 150 + (short)(ix4*3);
y1 = vert_coords(h1, tophgt);
y2 = vert_coords(h2, tophgt);
setcolor(25);
moveto( x1, y1);
lineto( x1, y2);
}
/* ----- Plot Mean-Layer SRW value (9-15km) ----- */
/* h1 = 9000; */
/* h2 = 15000; */
/* ----- Plot Mean-Layer SRW value (9-11km) ----- */
h1 = 9000;
h2 = 11000;
sr_wind( i_pres(msl(h1)), i_pres(msl(h2)),
st_dir, st_spd, &ix1, &ix2, &ix3, &ix4);
if(qc(ix4))
{
x1 = hov.brx - 150 + (short)(ix4*3);
y1 = vert_coords(h1, tophgt);
y2 = vert_coords(h2, tophgt);
setcolor(7);
moveto( x1, y1);
lineto( x1, y2);
}
/* ----- Plot Vertical RH profile ----- */
/*
setcolor(3);
setlinestyle(2, 1);
x2=999;
for(h=bothgt; h<=tophgt; h += 250)
{
mean_relhum( &ix1, i_pres(msl(h)), i_pres(msl(h)));
x1 = hov.brx - 150 + (short)(ix1/2*3);
y1 = vert_coords(h, tophgt);
if(x2 == 999) { x2=x1; y2=y1; }
moveto( x1, y1);
lineto( x2, y2);
x2=x1;
y2=y1;
}
*/
}
/*NP*/
short vert_coords( float hgt, float maxhgt )
/*************************************************************/
/* VERT_COORDS */
/* John Hart NSSFC KCMO */
/* */
/* Determines the y-pixel value for given height (m). */
/*************************************************************/
{
float xfactor = 1/(maxhgt/150);
return (short)((hov.tly + 150) - (hgt * xfactor));
}
/*NP*/
void plot_thetae(void)
/*************************************************************/
/* PLOT_THETAE */
/* John Hart NSSFC KCMO */
/* */
/* Plots vertical profile of Theta-E (sfc-300mb) */
/* Plots vertical profile of Theta-E (sfc-500mb) */
/*************************************************************/
{
float bothgt, tophgt, h, ix1, ix2, ix3, cthe;
float ct1, ct2, ct3, nct;
short x1, y1, x2, y2, x3, y3, i;
char st[40];
setcliprgn( hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(0);
setlinestyle( 1, 1 );
rectangle( 1, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
setcolor(1);
rectangle( 0, hov.brx-150, hov.tly, hov.brx, hov.tly+150);
/* ----- Set Layer (AGL) ----- */
bothgt = 0;
tophgt = agl(i_hght(500));
if(! qc(tophgt)) tophgt = 5500;
/* ----- Plot Label ----- */
setcolor(1);
outgtext( "Theta-E vs", hov.brx-105, hov.tly + 3 );
outgtext( "Height", hov.brx-105, hov.tly + 15 );
/* ----- Plot horizontal legend ----- */
ct1 = thetae( 850, i_temp(850), i_dwpt(850));
ct2 = thetae( 700, i_temp(700), i_dwpt(700));
ct3 = thetae( sndg[sfc()][1], sndg[sfc()][3], sndg[sfc()][4] );
cthe = 0; nct = 0;
if(qc(ct1))
{
cthe = cthe + ct1;
nct++;
}
if(qc(ct2))
{
cthe = cthe + ct2;
nct++;
}
if(qc(ct1))
{
cthe = cthe + ct3;
nct++;
}
if(nct < 1) return;
cthe = cthe / nct;
setcolor(1);
/* for(h=-60; h<=140; h += 20) */
for(h=cthe - 30.0; h<=cthe+30.0; h += 10)
{
/* x1 = hov.brx - 70 + (short)(h/2); */
x1 = (short)(hov.brx - 75 + ((h-cthe)*2.5));
y1 = hov.tly+150;
moveto( x1, y1);
lineto( x1, y1-5);
}
/* ----- Plot vertical theta-e profile ----- */
setlinestyle( 1, 2 );
setcolor(2);
x2 = 999;
for(i=0; sndg[i][1] >= 500; i++)
{
if (qc(sndg[i][4]))
{
/* x1 = (short)(hov.brx - 150 + thetae( sndg[i][1], sndg[i][3], sndg[i][4])); */
x1 = (short)(hov.brx - 75 + ((thetae( sndg[i][1], sndg[i][3], sndg[i][4])-cthe)*2.5));
y1 = vert_coords(agl(sndg[i][2]), tophgt);
if(x2 == 999) { x2=x1; y2=y1; }
moveto( x1, y1);
lineto( x2, y2);
x2=x1;
y2=y1;
}
}
/* ----- Plot Vertical Legend ----- */
setlinestyle( 1, 1 );
setcolor(1);
x2 = 999;
for(i=1000; i >= 600; i -= 100)
{
x1 = (short)(hov.brx - 150);
y1 = vert_coords(agl(i_hght(i)), tophgt);
moveto( x1, y1);
lineto( x1+5, y1);
}
}