home *** CD-ROM | disk | FTP | other *** search
- /* General line-drawing routine which takes line styles into account */
-
- #include "plplot.h"
- #include "declare.h"
- #include <math.h>
-
- static PLINT lastx=-100000, lasty=-100000;
-
- void genlin(x1,y1,x2,y2)
- PLINT x1,y1,x2,y2;
- {
- PLINT nx,ny;
- PLINT modulo, incr, dx, dy, diax, diay, i, temp, x, y;
- PLINT px, py, tstep;
-
- /* Check for solid line */
-
- if (nms == 0) {
- grline(x1,y1,x2,y2);
- return;
- }
-
- /* Check if pattern needs to be restarted */
-
- if (x1 != lastx || y1 != lasty) {
- curel = 0;
- pendn = 1;
- timecnt = 0;
- alarm = mark[curel];
- if (x1 == x2 && y1 == y2) grline(x1,y1,x2,y2);
- }
-
- lastx = x1;
- lasty = y1;
-
- if (x1 == x2 && y1 == y2) return;
-
- nx = x2 - x1;
- ny = y2 - y1;
-
- if (abs(ny) > abs(nx)) {
- modulo = abs(ny);
- incr = abs(nx);
- dx = 0;
- dy = -1;
- if (ny > 0) dy = 1;
- }
- else {
- modulo = abs(nx);
- incr = abs(ny);
- dx = -1;
- if (nx > 0) dx = 1;
- dy = 0;
- }
-
- diax = -1;
- if (nx > 0) diax = 1;
- diay = -1;
- if (ny > 0) diay = 1;
-
- temp = modulo/2;
- x = x1;
- y = y1;
- i = 1;
-
- /* Compute the timer step */
-
- tstep = sqrt(pow((double)(abs(nx)*umx),2.)+
- pow((double)(abs(ny)*umy),2.))/modulo;
-
- loop:
- if (i > modulo) goto exit;
- i = i+1;
- temp = temp+incr;
- px = x;
- py = y;
- if (temp > modulo) {
- temp = temp-modulo;
- x = x + diax;
- y = y + diay;
- }
- else {
- x = x + dx;
- y = y + dy;
- }
- timecnt += tstep;
- if (timecnt >= alarm) {
- plupd();
- if (pendn == 0) grline(lastx,lasty,px,py);
- lastx = x;
- lasty = y;
- }
- goto loop;
-
- exit:
- if (pendn != 0) grline(lastx,lasty,x,y);
- lastx = x2;
- lasty = y2;
- }
-
-