1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
# include "appUtilConfig.h"
# include <string.h>
# include "geo2DInteger.h"
void docInitRectangle( DocumentRectangle * dr )
{ dr->drX0= dr->drY0= dr->drX1= dr->drY1= 0; return; }
/************************************************************************/
/* */
/* Remove the possible orientation of a rectangle: Make sure x0 <= x1 */
/* and y0 <= y1. */
/* */
/************************************************************************/
void docNormalizeRectangle( DocumentRectangle * drTo,
const DocumentRectangle * drFrom )
{
DocumentRectangle dr;
int swap;
dr= *drFrom;
if ( dr.drX1 < dr.drX0 )
{ swap= dr.drX1; dr.drX1= dr.drX0; dr.drX0= swap; }
if ( dr.drY1 < dr.drY0 )
{ swap= dr.drY1; dr.drY1= dr.drY0; dr.drY0= swap; }
*drTo= dr;
return;
}
void docUnionRectangle( DocumentRectangle * dr,
const DocumentRectangle * dr1,
const DocumentRectangle * dr2 )
{
if ( dr1->drX0 < dr2->drX0 )
{ dr->drX0= dr1->drX0; }
else{ dr->drX0= dr2->drX0; }
if ( dr1->drY0 < dr2->drY0 )
{ dr->drY0= dr1->drY0; }
else{ dr->drY0= dr2->drY0; }
if ( dr1->drX1 < dr2->drX1 )
{ dr->drX1= dr2->drX1; }
else{ dr->drX1= dr1->drX1; }
if ( dr1->drY1 < dr2->drY1 )
{ dr->drY1= dr2->drY1; }
else{ dr->drY1= dr1->drY1; }
}
int docIntersectRectangle( DocumentRectangle * dr,
const DocumentRectangle * dr1,
const DocumentRectangle * dr2 )
{
DocumentRectangle res= *dr1;
if ( dr1->drX1 < dr2->drX0 )
{ return 0; }
if ( dr2->drX1 < dr1->drX0 )
{ return 0; }
if ( dr1->drY1 < dr2->drY0 )
{ return 0; }
if ( dr2->drY1 < dr1->drY0 )
{ return 0; }
if ( ! dr )
{ return 1; }
if ( dr1->drX0 < dr2->drX0 )
{ res.drX0= dr2->drX0; }
else{ res.drX0= dr1->drX0; }
if ( dr1->drY0 < dr2->drY0 )
{ res.drY0= dr2->drY0; }
else{ res.drY0= dr1->drY0; }
if ( dr1->drX1 < dr2->drX1 )
{ res.drX1= dr1->drX1; }
else{ res.drX1= dr2->drX1; }
if ( dr1->drY1 < dr2->drY1 )
{ res.drY1= dr1->drY1; }
else{ res.drY1= dr2->drY1; }
*dr= res; return 1;
}
|