home *** CD-ROM | disk | FTP | other *** search
- // $Id: tree.vsl,v 1.6 1998/11/23 13:53:03 zeller Exp $
- // Draw trees
-
- // Copyright (C) 1993 Technische Universitaet Braunschweig, Germany.
- // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
- //
- // This file is part of the DDD Library.
- //
- // The DDD Library is free software; you can redistribute it and/or
- // modify it under the terms of the GNU Library General Public
- // License as published by the Free Software Foundation; either
- // version 2 of the License, or (at your option) any later version.
- //
- // The DDD Library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- // See the GNU Library General Public License for more details.
- //
- // You should have received a copy of the GNU Library General Public
- // License along with the DDD Library -- see the file COPYING.LIB.
- // If not, write to the Free Software Foundation, Inc.,
- // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- //
- // DDD is the data display debugger.
- // For details, see the DDD World-Wide-Web page,
- // `http://www.cs.tu-bs.de/softech/ddd/',
- // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
-
- #include "std.vsl"
- #include "slopes.vsl"
-
- // Version
- tree_version() = "$Revision: 1.6 $";
-
- // Tree functions
-
- // 1. Vertical Trees
-
- // Ratio HEIGHT : WIDTH (1:10)
-
- treeheight(width) = vspace(square(width)) / 10;
-
- // draw the connections from the root to the children
- // return a box of width HROOT * 2 and height HEIGHT
- // There will be a line from the center of the upper edge of HSUM + BOX/2
- // to the center of the upper edge of the box
-
- vbranch(height, hroot, hsum, hbox2) =
- ( height &
- if hsum & hbox2 < hroot then
- // Box in left half
- hsum & hbox2 & rise() & hroot
- elsif hsum & hbox2 > hroot then
- // Box in right half
- hroot & fall() & hspace(hroot * 2 - hsum - hbox2)
- else
- // Box in center
- hcenter(vrule())
- fi
- );
-
- vbranches(height, hroot, hsum, box) =
- vbranch(height, hroot, hsum, hspace(box)/2);
-
- vbranches(height, hroot, hsum, box, ...) =
- vbranches(height, hroot, hsum, box)
- ^ vbranches(height, hroot, hsum & hspace(box), ...);
-
-
- // vtree(children...) connects a root with its children. The edges
- // end in the center of the upper edge of the children.
-
- _vtree(align, ...) =
- vbranches(treeheight(hspace(align)), hspace(align)/2, 0, ...)
- | hcenter(align);
-
- vtree(root) = root;
- vtree(root, ...) =
- hcenter(root)
- | _vtree(halign(...), ...);
-
-
-
- // 2. Horizontal Trees
-
- // Just the same, only rotated by 90 degrees.
-
- treewidth(height) = hspace(square(height)) / 10;
-
- hbranch(width, vroot, vsum, vbox2) =
- ( width |
- if vsum | vbox2 < vroot then
- // Box in upper half
- vsum | vbox2 | rise() | vroot
- elsif vsum | vbox2 > vroot then
- // Box in lower half
- vroot | fall() | vspace(vroot * 2 - vsum - vbox2)
- else
- // Box in center
- vcenter(hrule())
- fi
- );
-
- hbranches(width, vroot, vsum, box) =
- hbranch(width, vroot, vsum, vspace(box)/2);
-
- hbranches(width, vroot, vsum, box, ...) =
- hbranches(width, vroot, vsum, box)
- ^ hbranches(width, vroot, vsum | vspace(box), ...);
-
- _htree(align, ...) =
- hbranches(treewidth(vspace(align)), vspace(align)/2, 0, ...)
- & vcenter(align);
-
- htree(root) = root;
- htree(root, ...) =
- vcenter(root)
- & _htree(valign(...), ...);
-