Advertisement
Guest User

Untitled

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