AUSAM/source/libt/source/sdasha.c

#include "cplot.h"
sdasha(x,y,type)
int x,y,type;
{

	/*
	** This routine has a bug in that it relies
	** totaly on floats. A better routine should be
	** written, but we don't have the time to devote to
	** it at the moment. So please feel free to write
	** a better one and tell the authors about it
	*/
	double dist, tdist;
	double deltax, deltay;
	int len, saved;
	double sqrt();

	/*
	** TYPE 0 IS ALWAYS DEFINED AS A DRAW
	*/
	if( !type )
	{
		sdrawa(x,y);
		return;
	}

	if( !g_solve(g_spx,g_spy,x,y) )
	{
		/*
		** If both points are off screen then
		** don't do anything much
		*/
		g_scan = 0;
		g_spx = x;
		g_spy = y;
		g_status = g_last & ~ONSCREEN;
		return;
	}

	deltax = g_sqx2 - g_sqx1;
	deltay = g_sqy2 - g_sqy1;
	g_xold = g_xpos = g_sqx1;
	g_yold = g_ypos = g_sqy1;

	/*
	** TDIST CHANGES BUT DIST DOES NOT
	*/
	tdist = dist = sqrt(deltax*deltax + deltay*deltay );
	if( (g_status & ALPHA) || ! (g_status & ONSCREEN) )
	{
		g_last =& ~ONSCREEN;
	}
	if( dist<= g_dashbit)
	{
		go(g_xpos = g_sqx2, g_ypos =  g_sqy2);
		g_dashbit =- dist;
		g_spx = x;
		g_spy = y;
		g_status = g_last;
		return;
	}

	go( g_xpos =+ (deltax*g_dashbit)/dist, g_ypos =+ (deltay*g_dashbit)/dist );
	tdist =- g_dashbit;
	/* Flip the dash status */
	if( g_last & DASHMOVE )
	{
		g_last =& ~(DASHMOVE);
		g_last =| ONSCREEN;
	}
	else
	{
		g_last =| DASHMOVE;
		g_last =& ~ONSCREEN;
	}


	while( tdist> (len= g_dashtable[type][g_scan = (g_scan+1) %4]) )
	{
		go(g_xpos =+ (deltax*len)/dist, g_ypos =+ (deltay*len)/dist);
		tdist =- len;
		if( g_last & DASHMOVE )
		{
			g_last =& ~(DASHMOVE);
			g_last =& ~ONSCREEN;
		}
		else
		{
			g_last =| DASHMOVE;
			g_last =| ONSCREEN;
		}
	}

	go( g_xpos = g_sqx2, g_ypos =  g_sqy2);	/* GO THE LAST BIT */
	g_dashbit = len - tdist;

	g_spx = x;
	g_spy = y;
	g_status = g_last;
}
go(x,y)
double x,y;
{
	int xint,yint;
	if( !(g_last & DASHMOVE))
	{
/*
		if(! ((g_last & ONSCREEN) || (g_last & ALPHA)) )
		{
*/
			g_graphics();
			g_putxy(xint=g_xold,yint=g_yold);
/*
			g_last =| ONSCREEN;
		}
*/
		g_putxy( xint=x,yint=y);
	}
	else
	{
/*
		g_last =& ~ONSCREEN;
*/
	}
	g_xold = x;
	g_yold = y;
}