home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / LineGESI.C < prev    next >
C/C++ Source or Header  |  1998-08-03  |  6KB  |  211 lines

  1. // $Id: LineGESI.C,v 1.2 1998/08/03 12:18:14 zeller Exp $ -*- C++ -*-
  2. // Determine position of `self' edges
  3.  
  4. // Copyright (C) 1998 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. char LineGraphEdgeSelfInfo_rcsid[] = 
  30.     "$Id: LineGESI.C,v 1.2 1998/08/03 12:18:14 zeller Exp $";
  31.  
  32. #ifdef __GNUG__
  33. #pragma implementation
  34. #endif
  35.  
  36. #include "LineGESI.h"
  37.  
  38. #include "assert.h"
  39. #include <math.h>
  40. #include "pi.h"
  41. #include "hypot.h"
  42.  
  43. LineGraphEdgeSelfInfo::LineGraphEdgeSelfInfo(const BoxRegion& region,
  44.                          const GraphGC& gc)
  45. {
  46.     // Find edge position
  47.     diameter = gc.selfEdgeDiameter;
  48.  
  49.     // Make sure edge is still attached to node
  50.     diameter = min(diameter, region.space(X) + region.space(X) / 2);
  51.     diameter = min(diameter, region.space(Y) + region.space(Y) / 2);
  52.  
  53.     // Be sure we don't make it too small
  54.     diameter = max(diameter, 4);
  55.     radius = (diameter + 1) / 2;
  56.     diameter = radius * 2;
  57.  
  58.     arc_pos = region.origin();    // Upper left corner of the arc
  59.     arc_center = region.origin(); // Center of the arc
  60.     anno_pos = region.origin();    // Position of annotation
  61.     arc_start = 0;        // Start of the arc (in degrees)
  62.     arc_extend = 270;            // Extend of the arc (in degrees)
  63.  
  64.     switch (gc.selfEdgePosition)
  65.     {
  66.     case NorthEast:
  67.     arc_pos  += BoxPoint(region.space(X) - radius, -radius);
  68.     arc_center += BoxPoint(region.space(X), 0);
  69.     anno_pos += BoxPoint(region.space(X) + radius, -radius);
  70.     arc_start = 270;
  71.     break;
  72.  
  73.     case SouthEast:
  74.     arc_pos  += BoxPoint(region.space(X) - radius,
  75.                  region.space(Y) - radius);
  76.     arc_center += BoxPoint(region.space(X), region.space(Y));
  77.     anno_pos += BoxPoint(region.space(X) + radius,
  78.                  region.space(Y) + radius);
  79.     arc_start = 180;
  80.     break;
  81.  
  82.     case SouthWest:
  83.     arc_pos  += BoxPoint(-radius, region.space(Y) - radius);
  84.     arc_center += BoxPoint(0, region.space(Y));
  85.     anno_pos += BoxPoint(-radius, region.space(Y) + radius);
  86.     arc_start = 90;
  87.     break;
  88.  
  89.     case NorthWest:
  90.     arc_pos  += BoxPoint(-radius, -radius);
  91.     arc_center += BoxPoint(0, 0);
  92.     anno_pos += BoxPoint(-radius, -radius);
  93.     arc_start = 0;
  94.     break;
  95.     }
  96.  
  97.     // Find arrow position and angle
  98.     arrow_angle = 0;
  99.     switch (gc.selfEdgeDirection)
  100.     {
  101.     case Clockwise:
  102.     arrow_angle = 360 - (arc_start + arc_extend + 180) % 360;
  103.     break;
  104.  
  105.     case Counterclockwise:
  106.     arrow_angle = 360 - (arc_start + 180) % 360;
  107.     break;
  108.     }
  109.     arrow_alpha = 2 * PI * arrow_angle / 360.0;
  110.     
  111.     // Incline arrow a little into the arc
  112.     double cosine = gc.arrowLength / (2.0 * radius);
  113.     double alpha_inclination = (PI / 2.0) - acos(cosine);
  114.     int angle_inclination = 
  115.     - (360 + int((alpha_inclination * 360.0 / (2.0 * PI)))) % 360;
  116.  
  117.     arrow_pos = region.origin();
  118.     switch (gc.selfEdgeDirection)
  119.     {
  120.     case Clockwise:
  121.     arrow_alpha -= alpha_inclination;
  122.      arrow_angle -= angle_inclination;
  123.     switch (gc.selfEdgePosition)
  124.     {
  125.     case NorthEast:
  126.         arrow_pos += BoxPoint(region.space(X), radius);
  127.         break;
  128.  
  129.     case SouthEast:
  130.         arrow_pos += BoxPoint(region.space(X) - radius, region.space(Y));
  131.         break;
  132.  
  133.     case SouthWest:
  134.         arrow_pos += BoxPoint(0, region.space(Y) - radius);
  135.         break;
  136.  
  137.     case NorthWest:
  138.         arrow_pos += BoxPoint(radius, 0);
  139.         break;
  140.     }
  141.     break;
  142.  
  143.     case Counterclockwise:
  144.     arrow_alpha += alpha_inclination;
  145.      arrow_angle += angle_inclination;
  146.     switch (gc.selfEdgePosition)
  147.     {
  148.     case NorthEast:
  149.         arrow_pos += BoxPoint(region.space(X) - radius, 0);
  150.         break;
  151.  
  152.     case SouthEast:
  153.         arrow_pos += BoxPoint(region.space(X), region.space(Y) - radius);
  154.         break;
  155.  
  156.     case SouthWest:
  157.         arrow_pos += BoxPoint(radius, region.space(Y));
  158.         break;
  159.  
  160.     case NorthWest:
  161.         arrow_pos += BoxPoint(0, radius);
  162.         break;
  163.     }
  164.     break;
  165.     }
  166.  
  167.     // Find FIG positions
  168.     fig_pos[0] = region.origin();
  169.     fig_pos[1] = region.origin();
  170.     fig_pos[2] = region.origin();
  171.  
  172.     int offset = int(sqrt(radius * radius / 2.0));
  173.  
  174.     switch (gc.selfEdgePosition)
  175.     {
  176.     case NorthEast:
  177.     fig_pos[0] += BoxPoint(region.space(X), radius);
  178.     fig_pos[1] += BoxPoint(region.space(X) + offset, -offset);
  179.     fig_pos[2] += BoxPoint(region.space(X) - radius, 0);
  180.     break;
  181.  
  182.     case SouthEast:
  183.     fig_pos[0] += BoxPoint(region.space(X) - radius, region.space(Y));
  184.     fig_pos[1] += BoxPoint(region.space(X) + offset, 
  185.                    region.space(Y) + offset);
  186.     fig_pos[2] += BoxPoint(region.space(X), region.space(Y) - radius);
  187.     break;
  188.  
  189.     case SouthWest:
  190.     fig_pos[0] += BoxPoint(region.space(X), region.space(Y) - radius);
  191.     fig_pos[1] += BoxPoint(-offset, region.space(Y) + offset);
  192.     fig_pos[2] += BoxPoint(region.space(X) + radius, region.space(Y));
  193.     break;
  194.  
  195.     case NorthWest:
  196.     fig_pos[0] += BoxPoint(radius, 0);
  197.     fig_pos[1] += BoxPoint(-offset, -offset);
  198.     fig_pos[2] += BoxPoint(0, radius);
  199.     break;
  200.     }
  201.  
  202.     if (gc.selfEdgeDirection == Clockwise)
  203.     {
  204.     BoxPoint pivot = fig_pos[0];
  205.     fig_pos[0] = fig_pos[2];
  206.     fig_pos[2] = pivot;
  207.     }
  208.  
  209.     // That's all, folks!
  210. }
  211.