home *** CD-ROM | disk | FTP | other *** search
- /* hlplot.c */
- #include "tdp.h"
- void hlplot(h, v, nhpts, inc, dir, pass2)
- int *h, *v;
- short nhpts, inc, dir, pass2;
- {
- register short ih,i, /* CURRENT HORIZ PIXEL, COUNTER */
- hlast,vlast,hthis,vthis; /* PREV, CURRENT DATA POINTS */
- short vtry, idh, idv; /* INTERPOLATED V VALUE, DELTA-H, DELTA-V */
- FFP dh, dv; /* FFP VERSIONS OF IDH, IDV */
-
- hlast = (short)*h; vlast = (short)*v;
-
- /*** INIT PEN FOR NEW LINE ***/
- pen(RESET,hlast,RESET,dir);
- if (!pass2) {
- if (vlast >= vhicum[hlast]) {
- if (!vhicum[hlast]) vlocum[hlast] = vlast-1;
- vhicum[hlast] = vlast; pen(DOWN,hlast,DATA,dir,vhicum);
- }
- }
- else {
- if (vlast <= vlocum[hlast])
- {vlocum[hlast] = vlast; pen(DOWN,hlast,DATA,dir,vlocum);}
- }
-
- /*** PLOT V(H) IN "DIR" DIRECTION ***/
- for (i=0; i < nhpts-1; i++) {
- hthis = (short)*(h += inc); vthis = (short)*(v += inc);
- idh = hthis-hlast; idv = vthis-vlast;
-
- /*** THE USUAL CASE: V(H) IS INTERPOLABLE IN [hlast..hthis] ***/
- if (abs(idh) > 2) {
- dv = (FFP)(idv); dh = (FFP)(idh); ih = hlast+dir;
- while (ih != hthis) {
- vtry = vlast + (short)(dv * (FFP)(ih-hlast)/dh);
- if (!pass2) {
- if (vtry >= vhicum[ih]) {
- if (!vhicum[ih]) vlocum[ih] = vtry-1;
- vhicum[ih] = vtry; pen(DOWN,ih,INTERP,dir,vhicum);
- }
- else
- pen(UP,ih,INTERP,dir,vhicum);
- }
- else {
- if (vtry <= vlocum[ih])
- {vlocum[ih] = vtry; pen(DOWN,ih,INTERP,dir,vlocum);}
- else
- pen(UP,ih,INTERP,dir,vlocum);
- }
- ih += dir;
- }
- }
- else {
- /*** SPECIAL CASE: (NEARLY) VERTICAL LINE SEGMENT ***/
- if (abs(idh) == 2) {
- if (!pass2) {
- if ((vtry=vlast+idv/2) >= vhicum[(ih=hlast+dir)]) {
- pen(DOWN,hlast,DATA,0,vhicum);
- if (!vhicum[ih]) vlocum[ih] = vtry-1;
- vhicum[ih] = vtry; pen(DOWN,ih,DATA,0,vhicum);
- }
- }
- else {
- if ((vtry=vlast+idv/2) <= vlocum[(ih=hlast+dir)]) {
- pen(DOWN,hlast,DATA,0,vlocum);
- vlocum[ih] = vtry; pen(DOWN,ih,DATA,0,vlocum);
- }
- }
- }
- else {
- if (!pass2)
- {if (vthis >= vhicum[hthis]) pen(DOWN,hlast,DATA,0,vhicum);}
- else
- {if (vthis <= vlocum[hthis]) pen(DOWN,hlast,DATA,0,vlocum);}
- }
- }
-
- /*** FINISH A LINE SEGMENT ***/
- if (!pass2) {
- if (vthis >= vhicum[hthis]) {
- if (!vhicum[hthis]) vlocum[hthis] = vthis-1;
- vhicum[hthis] = vthis; pen(DOWN,hthis,DATA,dir,vhicum);
- }
- else
- pen(UP,ih,DATA,dir,vhicum);
- }
- else {
- if (vthis <= vlocum[hthis])
- {vlocum[hthis] = vthis; pen(DOWN,hthis,DATA,dir,vlocum);}
- else
- pen(UP,ih,DATA,dir,vlocum);
- }
-
- hlast = hthis; vlast = vthis;
- }
- }
-
-