Advertisement
Guest User

Untitled

a guest
May 24th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. // Date: 2010-06-21
  2. // Author: Emden R. Gansner
  3.  
  4. BEGIN {
  5. double tw[node_t]; // width of tree rooted at node
  6. double nw[node_t]; // width of node
  7. double xoff[node_t]; // x offset of root from left side of its tree
  8. double sp = 36; // extra space between left and right subtrees
  9. double wd, w, w1, w2;
  10. double x, y, z;
  11. edge_t e1, e2;
  12. node_t n;
  13. }
  14. BEG_G {
  15. $.bb = "";
  16. $tvtype=TV_postfwd; // visit root after all children visited
  17. }
  18. N {
  19. sscanf ($.width, "%f", &w);
  20. w *= 72; // convert inches to points
  21. nw[$] = w;
  22. if ($.outdegree == 0) {
  23. tw[$] = w;
  24. xoff[$] = w/2.0;
  25. }
  26. else if ($.outdegree == 1) {
  27. e1 = fstout($);
  28. w1 = tw[e1.head];
  29. tw[$] = w1 + (sp+w)/2.0;
  30. if (e1.side == "left")
  31. xoff[$] = tw[$] - w/2.0;
  32. else
  33. xoff[$] = w/2.0;
  34. }
  35. else {
  36. e1 = fstout($);
  37. w1 = tw[e1.head];
  38. e2 = nxtout(e1);
  39. w2 = tw[e2.head];
  40. wd = w1 + w2 + sp;
  41. if (w > wd)
  42. wd = w;
  43. tw[$] = wd;
  44. xoff[$] = w1 + sp/2.0;
  45. }
  46. }
  47. BEG_G {
  48. $tvtype=TV_fwd; // visit root first, then children
  49. }
  50. N {
  51. if ($.indegree == 0) {
  52. sscanf ($.pos, "%f,%f", &x, &y);
  53. $.pos = sprintf("0,%f", y);
  54. }
  55. if ($.outdegree == 0) return;
  56. sscanf ($.pos, "%f,%f", &x, &y);
  57. wd = tw[$];
  58. e1 = fstout($);
  59. n = e1.head;
  60. sscanf (n.pos, "%f,%f", &z, &y);
  61. if ($.outdegree == 1) {
  62. if (e1.side == "left")
  63. n.pos = sprintf("%f,%f", x - tw[n] - sp/2.0 + xoff[n], y);
  64. else
  65. n.pos = sprintf("%f,%f", x + sp/2.0 + xoff[n], y);
  66. }
  67. else {
  68. n.pos = sprintf("%f,%f", x - tw[n] - sp/2.0 + xoff[n], y);
  69. e2 = nxtout(e1);
  70. n = e2.head;
  71. sscanf (n.pos, "%f,%f", &z, &y);
  72. n.pos = sprintf("%f,%f", x + sp/2.0 + xoff[n], y);
  73. }
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement