/* D_clip() D_clips, if necessary, lines extending outside of a window.
*
* The limits of the window are described by:
* e: east
* w: west
* s: south
* n: north
* Note that the following constraints must be true:
* ( w < e ) ( s < n )
*
* x and c_x are values to be compared to w and e
* y and c_y are values to be compared to s and n
*
* the x and c_x values returned lie between w and e
* the y and c_y values returned lie between s and n
*
* returns: 1 if any clipping occured, 0 otherwise
*/
/*!
* \brief clip coordinates to window
*
* A line
* represented by the coordinates x, y and c_x, c_y is clipped to
* the window defined by s (south), n (north), w
* (west), and e (east). Note that the following constraints must be
* true:
* w x and c_x are values to be compared to w and
e. The y and c_y are values to be compared to
s and n.
* The x and c_x values returned lie between w and
e. The y and c_y values returned lie between
s and n.
*
* \param s
* \param n
* \param w
* \param e
* \param x
* \param y
* \param c_x
* \param c_y
* \return int
*/
int D_clip(
register double s,
register double n,
register double w,
register double e,
register double *x,
register double *y,
register double *c_x,
register double *c_y )
{
int mod ;
mod = 0 ;
if (*x < w)
{
if (*c_x != *x)
*y = *y + (w - *x)/(*c_x - *x) * (*c_y - *y) ;
*x = w ;
mod = 1 ;
}
if (*x > e)
{
if (*c_x != *x)
*y = *y + (e - *x)/(*c_x - *x) * (*c_y - *y) ;
*x = e ;
mod = 1 ;
}
if (*c_x < w)
{
if (*c_x != *x)
*c_y = *c_y + (w - *c_x)/(*x - *c_x) * (*y - *c_y) ;
*c_x = w ;
mod = 1 ;
}
if (*c_x > e)
{
if (*c_x != *x)
*c_y = *c_y + (e - *c_x)/(*x - *c_x) * (*y - *c_y) ;
*c_x = e ;
mod = 1 ;
}
if (*y < s)
{
if (*c_y != *y)
*x = *x + (s - *y)/(*c_y - *y) * (*c_x - *x) ;
*y = s ;
mod = 1 ;
}
if (*y > n)
{
if (*c_y != *y)
*x = *x + (n - *y)/(*c_y - *y) * (*c_x - *x) ;
*y = n ;
mod = 1 ;
}
if (*c_y < s)
{
if (*c_y != *y)
*c_x = *c_x + (s - *c_y)/(*y - *c_y) * (*x - *c_x) ;
*c_y = s ;
mod = 1 ;
}
if (*c_y > n)
{
if (*c_y != *y)
*c_x = *c_x + (n - *c_y)/(*y - *c_y) * (*x - *c_x) ;
*c_y = n ;
mod = 1 ;
}
return (mod) ;
}