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

MultiPlatform

  1. Using a persistent dictionary (cf.~section~ref{Persistent Dictionaries}) for planar point location 
  2. (sweep line algorithm).
  3. medskip
  4. #include <LEDA/plane.h>\
  5. #include <LEDA/prio.h>\
  6. #include <LEDA/sortseq.h>\
  7. #include <LEDA/p_dictionary.h>\
  8. double $X_POS$;  // current position of sweep line
  9. int compare(segment $s1$,segment $s2$)\
  10. ${$\
  11. hspace*{.5cm}line $l1(s1)$;\
  12. hspace*{.5cm}line $l2(s2)$;
  13. hspace*{.5cm}double $y1 = l1.y_proj(X_POS)$;\
  14. hspace*{.5cm}double $y2 = l2.y_proj(X_POS)$;
  15. hspace*{.5cm}Return compare($y1,y2$);\
  16. $}$
  17. typedef priority_queue<segment,point> X_structure;\
  18. typedef p_dictionary<segment,int>     Y_structure;
  19. sortseq<double,Y_structure>  HISTORY;
  20. void SWEEP(list<segment>& $L$)
  21. ${$\
  22. hspace*{.5cm}// Precondition: L is a list of non-intersecting\
  23. hspace*{.5cm}// from left to right directed line segments
  24. hspace*{.5cm}X_structure    $X$;\
  25. hspace*{.5cm}Y_structure    $Y$;\           
  26. hspace*{.5cm}segment        $s$;
  27. hspace*{.5cm}Forall(s,L)hspace*{4.8cm}// initialize the X_structure\
  28. hspace*{1cm}${$ X.insert($s,s$.start());\
  29. hspace*{1.25cm}X.insert(s,s.end());\
  30. hspace*{1cm}$}$
  31. hspace*{.5cm}HISTORY.insert(-MAXDOUBLE,$Y$); // insert empty Y_structure at -infinity
  32. hspace*{.5cm}While( ! $X$.empty() )\
  33. hspace*{1cm}${$ point   $p$;\ 
  34. hspace*{1.25cm}segment $s$;\
  35. hspace*{1.25cm}$X$.del_min($s,p$);hspace*{3cm}// next event: endpoint p of segment s\
  36. hspace*{1.25cm}$X_POS = p.xcoord()$;
  37. hspace*{1.25cm}{bf if} ($s$.start()$==p$)\             
  38. hspace*{1.5cm}$Y = Y$.insert($s$,0);hspace*{2.25cm}// p is left end of s 
  39. hspace*{1.25cm}Else\
  40. hspace*{1.5cm}$Y = Y$.del($s$);hspace*{3cm}// p is right end of s
  41. hspace*{1.25cm}HISTORY.insert($X_POS,Y$);hspace*{.5cm}// insert Y into history sequence\ 
  42. hspace*{.5cm}$}$
  43. hspace*{.5cm}HISTORY.insert(MAXDOUBLE,$Y$);  // insert empty Y_structure at +infinity\
  44. $}$
  45. segment LOCATE(point $p$)
  46. ${$\
  47. hspace*{.5cm}$X_POS = p.xcoord()$;\
  48. hspace*{.5cm}Y_structure $Y$ = HISTORY.inf(HISTORY.pred($X_POS$));\
  49. hspace*{.5cm}p_dic_item $pit = Y$.succ(segment($p,0,1$));
  50. hspace*{.5cm}If ($pit != nil$)\ 
  51. hspace*{.75cm}Return $Y$.key($pit$);
  52. hspace*{.5cm}Else\
  53. hspace*{.75cm}Return segment(0);\
  54. $}$