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 >
Wrap
C/C++ Source or Header
|
1998-08-03
|
6KB
|
211 lines
// $Id: LineGESI.C,v 1.2 1998/08/03 12:18:14 zeller Exp $ -*- C++ -*-
// Determine position of `self' edges
// Copyright (C) 1998 Technische Universitaet Braunschweig, Germany.
// Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
//
// This file is part of DDD.
//
// DDD is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// DDD 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with DDD -- see the file COPYING.
// 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>.
char LineGraphEdgeSelfInfo_rcsid[] =
"$Id: LineGESI.C,v 1.2 1998/08/03 12:18:14 zeller Exp $";
#ifdef __GNUG__
#pragma implementation
#endif
#include "LineGESI.h"
#include "assert.h"
#include <math.h>
#include "pi.h"
#include "hypot.h"
LineGraphEdgeSelfInfo::LineGraphEdgeSelfInfo(const BoxRegion& region,
const GraphGC& gc)
{
// Find edge position
diameter = gc.selfEdgeDiameter;
// Make sure edge is still attached to node
diameter = min(diameter, region.space(X) + region.space(X) / 2);
diameter = min(diameter, region.space(Y) + region.space(Y) / 2);
// Be sure we don't make it too small
diameter = max(diameter, 4);
radius = (diameter + 1) / 2;
diameter = radius * 2;
arc_pos = region.origin(); // Upper left corner of the arc
arc_center = region.origin(); // Center of the arc
anno_pos = region.origin(); // Position of annotation
arc_start = 0; // Start of the arc (in degrees)
arc_extend = 270; // Extend of the arc (in degrees)
switch (gc.selfEdgePosition)
{
case NorthEast:
arc_pos += BoxPoint(region.space(X) - radius, -radius);
arc_center += BoxPoint(region.space(X), 0);
anno_pos += BoxPoint(region.space(X) + radius, -radius);
arc_start = 270;
break;
case SouthEast:
arc_pos += BoxPoint(region.space(X) - radius,
region.space(Y) - radius);
arc_center += BoxPoint(region.space(X), region.space(Y));
anno_pos += BoxPoint(region.space(X) + radius,
region.space(Y) + radius);
arc_start = 180;
break;
case SouthWest:
arc_pos += BoxPoint(-radius, region.space(Y) - radius);
arc_center += BoxPoint(0, region.space(Y));
anno_pos += BoxPoint(-radius, region.space(Y) + radius);
arc_start = 90;
break;
case NorthWest:
arc_pos += BoxPoint(-radius, -radius);
arc_center += BoxPoint(0, 0);
anno_pos += BoxPoint(-radius, -radius);
arc_start = 0;
break;
}
// Find arrow position and angle
arrow_angle = 0;
switch (gc.selfEdgeDirection)
{
case Clockwise:
arrow_angle = 360 - (arc_start + arc_extend + 180) % 360;
break;
case Counterclockwise:
arrow_angle = 360 - (arc_start + 180) % 360;
break;
}
arrow_alpha = 2 * PI * arrow_angle / 360.0;
// Incline arrow a little into the arc
double cosine = gc.arrowLength / (2.0 * radius);
double alpha_inclination = (PI / 2.0) - acos(cosine);
int angle_inclination =
- (360 + int((alpha_inclination * 360.0 / (2.0 * PI)))) % 360;
arrow_pos = region.origin();
switch (gc.selfEdgeDirection)
{
case Clockwise:
arrow_alpha -= alpha_inclination;
arrow_angle -= angle_inclination;
switch (gc.selfEdgePosition)
{
case NorthEast:
arrow_pos += BoxPoint(region.space(X), radius);
break;
case SouthEast:
arrow_pos += BoxPoint(region.space(X) - radius, region.space(Y));
break;
case SouthWest:
arrow_pos += BoxPoint(0, region.space(Y) - radius);
break;
case NorthWest:
arrow_pos += BoxPoint(radius, 0);
break;
}
break;
case Counterclockwise:
arrow_alpha += alpha_inclination;
arrow_angle += angle_inclination;
switch (gc.selfEdgePosition)
{
case NorthEast:
arrow_pos += BoxPoint(region.space(X) - radius, 0);
break;
case SouthEast:
arrow_pos += BoxPoint(region.space(X), region.space(Y) - radius);
break;
case SouthWest:
arrow_pos += BoxPoint(radius, region.space(Y));
break;
case NorthWest:
arrow_pos += BoxPoint(0, radius);
break;
}
break;
}
// Find FIG positions
fig_pos[0] = region.origin();
fig_pos[1] = region.origin();
fig_pos[2] = region.origin();
int offset = int(sqrt(radius * radius / 2.0));
switch (gc.selfEdgePosition)
{
case NorthEast:
fig_pos[0] += BoxPoint(region.space(X), radius);
fig_pos[1] += BoxPoint(region.space(X) + offset, -offset);
fig_pos[2] += BoxPoint(region.space(X) - radius, 0);
break;
case SouthEast:
fig_pos[0] += BoxPoint(region.space(X) - radius, region.space(Y));
fig_pos[1] += BoxPoint(region.space(X) + offset,
region.space(Y) + offset);
fig_pos[2] += BoxPoint(region.space(X), region.space(Y) - radius);
break;
case SouthWest:
fig_pos[0] += BoxPoint(region.space(X), region.space(Y) - radius);
fig_pos[1] += BoxPoint(-offset, region.space(Y) + offset);
fig_pos[2] += BoxPoint(region.space(X) + radius, region.space(Y));
break;
case NorthWest:
fig_pos[0] += BoxPoint(radius, 0);
fig_pos[1] += BoxPoint(-offset, -offset);
fig_pos[2] += BoxPoint(0, radius);
break;
}
if (gc.selfEdgeDirection == Clockwise)
{
BoxPoint pivot = fig_pos[0];
fig_pos[0] = fig_pos[2];
fig_pos[2] = pivot;
}
// That's all, folks!
}