Advertisement
Alberts00

robredz.cpp

Jan 20th, 2012
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.12 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5.  
  6. #undef DEBUG
  7.  
  8. #define IFILE   "robredz.dat"
  9. #define OFILE   "robredz.rez"
  10. #define MAXROCKS 30000
  11. #define M_DIF  1.0e-10
  12. #define MAX(x,y)    (((x)>(y))?(x):(y))
  13. #define MIN(x,y)    (((x)<(y))?(x):(y))
  14.  
  15. #ifdef DEBUG
  16. #define COMPSTR  (i == 25)
  17. #endif  
  18.  
  19. using namespace std;
  20.  
  21. struct s_kli { long frX,toX,frY,toY,frN,toN,initI, live, incl; double frR,toR; } kli[MAXROCKS*2];
  22. struct s_seg { long iN,iN0,iN1,iBS; double iR0, iR1; } seg[8];
  23.  
  24. long double round(long double r){
  25.      return ( r > 0.0) ? floor(r+0.5) : ceil(r-0.5);
  26.      }
  27.      
  28. int compare (const void * a, const void * b){
  29.      const s_kli *ia = (const s_kli *)a;
  30.      const s_kli *ib = (const s_kli *)b;
  31.      if( (*ia).frN != (*ib).frN ) return ((*ia).frN - (*ib).frN);
  32.      return 0;
  33.      }
  34.  
  35. int main(int argc, char *argv[])
  36. {
  37.  
  38. long N,R,X,Y;
  39. int addR = 0,tmpIDX;
  40. long frX,toX,tmpX,prX,frY,toY,tmpY,prY;
  41. int i,j,k,tos,frs,swapQ;
  42. long double frR,toR,tmpR,prR;
  43. long double d_frsk,d_tosk;
  44.  
  45. ifstream ifs (IFILE);
  46. if( ifs.is_open() ){
  47.   ifs >> N >> R >> X >> Y;
  48.   seg[0].iN = Y;   seg[0].iBS = X;   seg[0].iN0 = 1;               seg[0].iN1 = Y;       seg[0].iR0 = -M_PI;      seg[0].iR1 = atan2(-(long double)Y,-(long double)X);
  49.   seg[1].iN = X;   seg[1].iBS = Y;   seg[1].iN0 = seg[0].iN1+1;    seg[1].iN1 = X+Y;     seg[1].iR0 = seg[0].iR1; seg[1].iR1 = -M_PI/2;
  50.   seg[2].iN = N-X; seg[2].iBS = Y;   seg[2].iN0 = seg[1].iN1+1;    seg[2].iN1 = Y+N;     seg[2].iR0 = seg[1].iR1; seg[2].iR1 = atan2(-(long double)Y,(long double)(N-X));
  51.   seg[3].iN = Y;   seg[3].iBS = N-X; seg[3].iN0 = seg[2].iN1+1;    seg[3].iN1 = 2*Y+N;   seg[3].iR0 = seg[2].iR1; seg[3].iR1 = 0.0;
  52.   seg[4].iN = N-Y; seg[4].iBS = N-X; seg[4].iN0 = seg[3].iN1+1;    seg[4].iN1 = 2*N+Y;   seg[4].iR0 = seg[3].iR1; seg[4].iR1 = atan2((long double)(N-Y),(long double)(N-X));
  53.   seg[5].iN = N-X; seg[5].iBS = N-Y; seg[5].iN0 = seg[4].iN1+1;    seg[5].iN1 = 3*N+Y-X; seg[5].iR0 = seg[4].iR1; seg[5].iR1 = M_PI/2.0;
  54.   seg[6].iN = X;   seg[6].iBS = N-Y; seg[6].iN0 = seg[5].iN1+1;    seg[6].iN1 = 3*N+Y;   seg[6].iR0 = seg[5].iR1; seg[6].iR1 = atan2((long double)(N-Y),-(long double)X);
  55.   seg[7].iN = N-Y; seg[7].iBS = X;   seg[7].iN0 = seg[6].iN1+1;    seg[7].iN1 = 4*N;     seg[7].iR0 = seg[6].iR1; seg[7].iR1 = M_PI;
  56.  
  57.  
  58.   for( i = 0; i < R; i++){
  59.     ifs >> k;
  60.     ifs >> frX >> frY;
  61.     toX = frX; toY = frY; prX = frX; prY = frY;
  62.     frR = toR = prR = atan2((long double)(frY-Y),(long double)(frX-X));
  63.     swapQ = 0;
  64.     for( j = 1; j < k; j++ ){
  65.         ifs >> tmpX >> tmpY;
  66.         tmpR = atan2((long double)(tmpY-Y),(long double)(tmpX-X));
  67.         if( fabs(prR-tmpR) > M_PI & (!swapQ) ){
  68.             swapQ = 1;
  69.             if( prR > tmpR ) { toR = tmpR; toX = tmpX; toY = tmpY; }
  70.             else { frR = tmpR; frX = tmpX; frY = tmpY; }
  71.         } else if (swapQ) {
  72.              if( (tmpR < frR) && (tmpR > 0.0 ) )  { frR = tmpR; frX = tmpX; frY = tmpY; }
  73.              else if ( (tmpR > toR) && (tmpR < 0.0) ) { toR = tmpR; toX = tmpX; toY = tmpY; }  
  74.         } else {    
  75.             if( tmpR < frR ) { frR = tmpR; frX = tmpX; frY = tmpY; }
  76.             else if (tmpR > toR ) { toR = tmpR; toX = tmpX; toY = tmpY; }
  77.         }
  78.         prX = tmpX; prY = tmpY; prR = tmpR;
  79.     }
  80.     kli[i].frX = frX; kli[i].frY = frY; kli[i].frR = frR;
  81.     kli[i].toX = toX; kli[i].toY = toY; kli[i].toR = toR;
  82.     kli[i].initI = i;
  83.     kli[i].live = 1;
  84.    
  85.     frs = -1; tos = -1; // from segment, to segment
  86.  
  87.     for( j = 0; j < 8; j++ ) {
  88.         if( (frR >= seg[j].iR0) && (frR <= seg[j].iR1) ) frs = j;
  89.         if( (toR >= seg[j].iR0) && (toR <= seg[j].iR1) ) tos = j;
  90.         }
  91.    
  92. // Apstrādājam no punktu
  93.     if( frY == Y ){
  94.         if ( frX < X ) frs = 7; else frs = 3;
  95.         kli[i].frN=seg[frs].iN1;
  96.     } else if( frX == X ){
  97.         if ( frY < Y ) frs = 1; else frs = 5;
  98.         kli[i].frN=seg[frs].iN1;
  99.     } else if( frs % 2 == 1 ){  // OK
  100.         d_frsk = fabs((long double)(seg[frs].iBS)*tan(seg[frs].iR1-kli[i].frR));
  101.         kli[i].frN = seg[frs].iN1 - (long)floor(d_frsk+M_DIF);
  102.     } else if( frs % 2 == 0 ){ // OK
  103.         d_frsk = fabs((long double)(seg[frs].iBS)*tan(kli[i].frR-seg[frs].iR0));
  104.         kli[i].frN = seg[frs].iN0 - 1 + (long)ceil(d_frsk-M_DIF);
  105.     }  
  106.    
  107.    
  108. // Apstrādājam lidz punktu
  109.     if( toY == Y ){
  110.         if ( toX < X ) tos = 7; else tos = 3;
  111.         kli[i].toN=seg[tos].iN1;
  112.     } else if( toX == X ){
  113.         if ( toY < Y ) tos = 1; else tos = 5;
  114.         kli[i].toN=seg[tos].iN1;
  115.     } else if( tos % 2 == 1 ){ // OK
  116.         d_tosk = fabs((long double)(seg[tos].iBS)*tan(seg[tos].iR1-kli[i].toR));
  117.         kli[i].toN = seg[tos].iN1 - 1 - (long)floor(d_tosk-M_DIF);
  118.     } else if( tos % 2 == 0 ){ // OK
  119.         d_tosk = fabs((long double)(seg[tos].iBS)*tan(kli[i].toR-seg[tos].iR0));
  120.         kli[i].toN = seg[tos].iN0 - 1 + (long)floor(d_tosk+M_DIF);
  121.     }  
  122.  
  123.     if( (frR-toR)>0.0 ) {
  124.         tmpIDX = R + (++addR) - 1;
  125.         kli[tmpIDX].frN = 1;
  126.         kli[tmpIDX].toN = kli[i].toN;
  127.         kli[tmpIDX].live = 1;
  128.         kli[tmpIDX].initI = tmpIDX;
  129.         kli[i].toN = 4*N;
  130.        
  131.     }
  132.    
  133. }        
  134. }
  135. ifs.close();
  136.  
  137. R += addR;
  138. qsort(kli,R,sizeof(struct s_kli),compare);
  139.    
  140. int     stabi = 0;
  141. /*---------------------------*/
  142. /* Sakam sektoru apvienosanu */
  143.  
  144.  
  145. long frS,frT,toS,toT;
  146.  
  147. i = 0;
  148. while( i < R ){
  149.      j = i ;  
  150.      while( ++j < R ){
  151.           if( !kli[j].live ) continue;
  152.           frT = kli[i].frN; toT = kli[i].toN; frS = kli[j].frN; toS = kli[j].toN;
  153.           if( (frS >= frT) && ( toS <= toT )) { kli[j].live = 0; kli[j].incl = kli[i].initI;
  154.           } else if ( ( frS > toT+1 ) || (toS < frT -1) ) { i = j-1; break;
  155.           } else {
  156.                  kli[j].live = 0; kli[j].incl = kli[i].initI;
  157.                  if( frT > frS )kli[i].frN = frS;
  158.                  if( toT < toS ) kli[i].toN = toS;
  159.                  }  
  160.      }
  161.      if( j == R ) break;
  162.      ++i;
  163. }  
  164.  
  165.  
  166. /*---------------------------------------*/
  167. /* Skaitam neredzamos stabiņus             */
  168.  
  169. tmpX = 0;
  170. for( i = 0; i < R; i++ ){
  171.      if( kli[i].live ) tmpX += (kli[i].toN - kli[i].frN + 1);
  172.      }
  173.      
  174. stabi = 4*N-tmpX;    
  175.  
  176. ofstream ofs (OFILE);
  177. if( ofs.is_open() ){
  178.     ofs << stabi << endl;
  179.     ofs.close();
  180.     }  
  181.     return 0;
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement