]> www.wagner.pp.ru Git - oss/fgis.git/blob - lib/overlay.c
First checked in version
[oss/fgis.git] / lib / overlay.c
1 #include <math.h>
2 #include <stdlib.h>
3 #include "epp.h"
4 int compare_cell_size(EPP *f1,EPP *f2)
5 { double xsize1=fabs(f1->XRight-f1->XLeft)/(f1->lc-f1->fc);
6   double xsize2=fabs(f2->XRight-f2->XLeft)/(f2->lc-f2->fc);
7   double ysize1=fabs(f1->YTop-f1->YBottom)/(f1->lr-f1->fr); 
8   double ysize2=fabs(f2->YTop-f2->YBottom)/(f2->lr-f2->fr); 
9 /*  fprintf(stderr,"Xsize ratio %g X tolerance %g\nYsize ratio %g Y tolerance %g\n",
10    xsize1/xsize2,1.0/(f1->lc-f1->fc),ysize1/ysize2,1.0/(f1->lr-f1->fr));
11 */  return (fabs(xsize1/xsize2-1.0)<1.0/(f1->lc-f1->fc)&&
12      fabs(ysize1/ysize2-1.0)<1.0/(f1->lr-f1->fr));
13 }
14 int is_aligned(EPP *f1,EPP *f2)
15 { if (!compare_cell_size(f1,f2)) return 0;
16    return (epp_row(f1,alt_yc(f2,f2->fr))==f2->fr&&
17        epp_col(f1,alt_xc(f2,f2->fc))==f2->fc); 
18 }
19 EPP_LINK link_epp(EPP *base,EPP *overlay)
20 {double x1,y1,x2,y2;
21  EPP_LINK tmp=malloc(sizeof(LINK_BUFFER));
22  if (base->XLeft<base->XRight)
23   {x1=base->XLeft<overlay->XLeft?base->XLeft:overlay->XLeft;
24    x2=base->XRight>overlay->XRight?base->XRight:overlay->XRight;
25   }
26   else
27   {x1=base->XLeft>overlay->XLeft?base->XLeft:overlay->XLeft;
28    x2=base->XRight<overlay->XRight?base->XRight:overlay->XRight;
29   }
30  if (base->YBottom<base->YTop)
31   {y1=base->YBottom<overlay->YBottom?base->YBottom:overlay->YBottom;
32    y2=base->YTop>overlay->YTop?base->YTop:overlay->YTop;
33   }
34   else
35   {y1=base->YBottom>overlay->YBottom?base->YBottom:overlay->YBottom;
36    y2=base->YTop<overlay->YTop?base->YTop:overlay->YTop;
37   }
38  tmp->ax=epp_col(overlay,x2)-epp_col(overlay,x1);
39  tmp->cx=epp_col(base,x2)-epp_col(base,x1);
40  tmp->bx=epp_col(overlay,x1)*tmp->cx-epp_col(base,x1)*tmp->ax;
41  tmp->ay=epp_row(overlay,y2)-epp_row(overlay,y1);
42  tmp->cy=epp_row(base,y2)-epp_row(base,y1);
43  tmp->by=epp_row(overlay,y1)*tmp->cy-epp_row(base,y1)*tmp->ay;
44  return tmp;
45 }
46 int linked_row(EPP_LINK link,int row)
47 { return (link->ay*row+link->by)/link->cy;
48 }
49 int linked_col(EPP_LINK link,int col)
50 { return (link->ax*col+link->bx)/link->cx;
51 }
52
53