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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  _triang.c
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #include <LEDA/plane_alg.h>
  12. typedef point  POINT;
  13. void TRIANGULATE_POINTS(list<POINT> L, GRAPH<POINT,edge>& G)
  14.   L.sort();  // sort pointss lexicographically
  15.   // eliminate multiple points
  16.   list_item it;
  17.   forall_items(it,L)
  18.   { list_item it1 = L.succ(it);
  19.     while (it1 != nil && L[it1] == L[it])
  20.     { L.del(it1);
  21.       it1 = L.succ(it);
  22.      }
  23.    }
  24.   // initialize convex hull with first three points
  25.   node u = G.new_node(L.pop());
  26.   node v = G.new_node(L.pop());
  27.   node w = G.new_node(L.pop());
  28.   edge e1 = G.new_edge(u,v,nil);
  29.   G[e1] = G.new_edge(v,u,e1);
  30.   edge e2 = G.new_edge(v,w,nil);
  31.   G[e2] = G.new_edge(w,v,e2);
  32.   edge e3 = G.new_edge(w,u,nil);
  33.   G[e3] = G.new_edge(u,w,e3);
  34.   edge last =  ( orientation(G[w],G[v],G[u]) < 0 ) ? G[e2] : e3;
  35.   // scan remaining points
  36.   POINT p;
  37.   forall(p,L) 
  38.   {
  39.     node  v = G.new_node(p);
  40.     // compute upper tangent (p,up)
  41.     edge up = last;
  42.     while (right_turn(p,G[source(up)],G[target(up)]))
  43.          up = G.cyclic_adj_succ(G[up]);
  44.     // compute lower tangent (p,low)
  45.     edge low = G[G.cyclic_adj_pred(last)];
  46.     while (left_turn(p,G[target(low)],G[source(low)]))
  47.          low = G[G.cyclic_adj_pred(low)];
  48.     // triangulate 
  49.     edge e = up; 
  50.     do { edge next = G[G.cyclic_adj_pred(e)];
  51.          edge x = G.new_edge(v,source(e),nil);
  52.          G[x] = G.new_edge(e,v,x,before);
  53.          e = next;
  54.         } while (e != low);
  55.     last = G.first_adj_edge(v);
  56.    }
  57. // if (!PLANAR(G)) error_handler(1,"graph not planar");
  58. }