home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / ledar34.zip / leda-r-3_4_tar / LEDA-3.4 / src / plane_alg / triv_segments.c < prev    next >
Text File  |  1996-09-03  |  2KB  |  79 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA 3.4
  4. +
  5. +  triv_segments.c
  6. +
  7. +  This file is part of the LEDA research version (LEDA-R) that can be 
  8. +  used free of charge in academic research and teaching. Any commercial
  9. +  use of this software requires a license which is distributed by the
  10. +  LEDA Software GmbH, Postfach 151101, 66041 Saarbruecken, FRG
  11. +  (fax +49 681 31104).
  12. +
  13. +  Copyright (c) 1991-1996  by  Max-Planck-Institut fuer Informatik
  14. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  15. +  All rights reserved.
  16. *******************************************************************************/
  17.  
  18. typedef void (*rep_int_func) (const SEGMENT&, const SEGMENT&);
  19.  
  20. void TRIVIAL_SEGMENTS(const list<SEGMENT>& L,  rep_int_func report_intersection)
  21. {
  22.   POINT inter;
  23.  
  24.   int N = L.length();
  25.  
  26.   if (N == 0) return;
  27.  
  28.   SEGMENT* A = new SEGMENT[N];
  29.   SEGMENT* p = A;
  30.  
  31.   SEGMENT s;
  32.   forall(s,L) *p++ = s;
  33.  
  34.   SEGMENT* stop = p;
  35.   
  36.   for(SEGMENT* a = A; a < stop; a++ )
  37.   { 
  38.     POINT as = a->source();
  39.     POINT at = a->target();
  40.  
  41.     for(SEGMENT* b = a+1; b < stop; b++ )
  42.     { 
  43.       POINT bs = b->source();
  44.       POINT bt = b->target();
  45.  
  46.       int o1 = orientation(*a,bs); 
  47.       int o2 = orientation(*a,bt);
  48.  
  49.       if (o1 == o2 && ( o1 != 0 || o2 != 0)) continue;
  50.  
  51.       int o3 = orientation(*b,as); 
  52.       int o4 = orientation(*b,at);
  53.     
  54.       if (o1 == 0 && o2 == 0 && o3 == 0 && o4 == 0)
  55.         { 
  56.           if ( compare(as,at) > 0 )
  57.           { at = a->source(); 
  58.             as = a->target(); 
  59.            }
  60.  
  61.           if ( compare(bs,bt) > 0 )
  62.           { bt = b->source(); 
  63.             bs = b->target(); 
  64.            }
  65.           
  66.           if ((compare(as,bs) <= 0 && compare(at,bs) >= 0) || 
  67.               (compare(bs,as) <= 0 && compare(bt,as) >= 0) )
  68.              report_intersection(*a,*b);
  69.          }
  70.        else
  71.          if (o1 != o2 && o3 != o4) report_intersection(*a,*b);
  72.       }
  73.    }
  74.  
  75.   delete[] A;
  76. }
  77.  
  78.