seg_inter.c
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:2k
开发平台:

MultiPlatform

  1. #include <LEDA/integer.h>
  2. bool intersection(integer s1x1, integer s1y1, integer s1x2, integer s1y2,
  3.                   integer s2x1, integer s2y1, integer s2x2, integer s2y2,
  4.                   integer& X, integer& Y, integer& W)
  5.   // decides whether |s| and |this| segment intersect and, if so, 
  6.   // returns the intersection in |I|. It is assumed that both segments 
  7.   // have non-zero length 
  8.   integer dx1 = s1x2 - s1x1;
  9.   integer dy1 = s1y2 - s1y1;
  10.   integer dx2 = s2x2 - s2x1;
  11.   integer dy2 = s2y2 - s2y1;
  12.   W = dy1*dx2 - dy2*dx1;
  13.   if (W == 0) return false;   // $slope(s) = slope(this)$
  14.   integer c1 =   s1x2*s1y1 -  s1x1*s1y2;
  15.   integer c2 =   s2x2*s2y1 -  s2x1*s2y2;
  16.   /* The underlying lines intersect in a point $p = (x,y,w)$.
  17.      We still have to test whether $p$ lies on both segments.
  18.      $p$ lies on $s$ ($this$)if its x-coordinate $x$ compares 
  19.      diffently with the x-coordinates of the two endpoints of $s$ ($this).
  20.    */
  21.   X = c2*dx1-c1*dx2;
  22.   if (sign(X-s1x1*W) == sign(X-s1x2*W) || 
  23.       sign(X-s2x1*W) == sign(X-s2x2*W )) return false;
  24.   Y = c2*dy1-c1*dy2;
  25.   return true;
  26. }
  27. main()
  28. {
  29.    int n = read_int("n = ");
  30.    int i,j;
  31.    long* x1 = new long[n];
  32.    long* x2 = new long[n];
  33.    long* y1 = new long[n];
  34.    long* y2 = new long[n];
  35.    rand_int.set_seed(12345*n);
  36.    for(i = 0; i < n; i++)
  37.    { x1[i] = rand_int();
  38.      x2[i] = rand_int();
  39.      y1[i] = rand_int();
  40.      y2[i] = rand_int();
  41.     }
  42.   float T = used_time();
  43.   int s = 0;
  44.   for(i=0; i<n; i++)
  45.   for(j=i+1; j<n; j++)
  46.   { integer x,y,w;
  47.     if(intersection(integer(x1[i]),integer(x2[i]),integer(y1[i]),integer(y2[i]),
  48.                     integer(x1[j]),integer(x2[j]),integer(y1[j]),integer(y2[j]),
  49.                     x,y,w)) s++;
  50.    }
  51.    cout << string("integer:    s = %3d    time = %5.2f",s,used_time(T)) << endl;
  52.    return 0;
  53. }