home *** CD-ROM | disk | FTP | other *** search
- /* hlcross.c */
- #include "tdp.h"
- void hlcross(h1_p, v1_p, h2_p, v2_p, npts, inc, dir, pass2)
- int *h1_p, *v1_p, *h2_p, *v2_p;
- short npts, inc, dir, pass2;
- {
- register short ih,i, /* CURRENT HORIZ PIXEL, COUNTER */
- h1, v1, h2, v2; /* PREV, CURRENT DATA POINTS */
- short vtry, idh, idv; /* INTERPOLATED V VALUE, DELTA-H, DELTA-V */
- FFP dh, dv; /* FFP VERSIONS OF IDH, IDV */
-
- /*** PLOT LINE SEGMENTS CONNECTING LINES PLOTTED BY HLPLOT() ***/
- for (i=0; i < npts; i++, h1_p+=inc, v1_p+=inc, h2_p+=inc, v2_p+=inc) {
-
- h1 = *h1_p; h2 = *h2_p; v1 = *v1_p; v2 = *v2_p;
- idh = h2-h1; idv = v2-v1;
-
- /*** INIT PEN FOR NEW LINE SEGMENT ***/
- pen(RESET,h1,RESET,dir);
- if (!pass2) {
- if (v1 >= vhicum[h1]) {
- if (!vhicum[h1]) vlocum[h1] = v1-1;
- vhicum[h1] = v1; pen(DOWN,h1,DATA,dir,vhicum);
- }
- else
- pen(UP,h1,DATA,dir,vhicum);
- }
- else {
- if (v1 <= vlocum[h1])
- {vlocum[h1] = v1; pen(DOWN,h1,DATA,dir,vlocum);}
- else
- pen(UP,h1,DATA,dir,vlocum);
- }
-
- /*** THE USUAL CASE: V(H) IS INTERPOLABLE IN [h1..h2] ***/
- if (abs(idh) > 2) {
- dv = (FFP)(idv); dh=(FFP)(idh); ih=h1+dir;
- while (ih != h2) {
- vtry = v1 + (short)(dv * (FFP)(ih-h1)/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=v1+idv/2) >= vhicum[(ih=h1+dir)]) {
- if (!vhicum[ih]) vlocum[ih] = vtry-1;
- pen(DOWN,h1,DATA,0,vhicum);
- vhicum[ih] = vtry; pen(DOWN,ih,DATA,0,vhicum);
- }
- }
- else {
- if ((vtry=v1+idv/2) <= vlocum[(ih=h1+dir)]) {
- pen(DOWN,h1,DATA,0,vlocum);
- vlocum[ih] = vtry; pen(DOWN,ih,DATA,0,vlocum);
- }
- }
- }
- else {
- if (!pass2)
- {if (v2 >= vhicum[h2]) pen(DOWN,h1,DATA,0,vhicum);}
- else
- {if (v2 <= vlocum[h2]) pen(DOWN,h1,DATA,0,vlocum);}
-
- }
- }
-
- /*** FINISH THIS LINE SEGMENT ***/
- if (!pass2) {
- if (v2 >= vhicum[h2]) {
- if (!vhicum[h2]) vlocum[h2] = v2-1;
- vhicum[h2] = v2; pen(DOWN,h2,DATA,dir,vhicum);
- }
- else
- pen(UP,h2,DATA,dir,vhicum);
- }
- else {
- if (v2 <= vlocum[h2])
- {vlocum[h2] = v2; pen(DOWN,h2,DATA,dir,vlocum);}
- else
- pen(UP,h2,DATA,dir,vlocum);
- }
- }
- }
-
-