绘制箭头到圆圈

时间:2013-06-05 21:13:46

标签: java graph graphics drawing

我正在创建包含顶点和边的图。图表是定向的,因此边缘表示为箭头。我的问题是获得箭头的正确坐标。

VertexCoordinate(见下面的课程),而EdgeVertex到另一个Vertex。挑战是以固定半径绘制顶点(见下图)。我在箭头指向圆周上的正确位置时遇到问题。看起来我现在拥有的代码,箭头指向左上角,而不是最近的点。

我有以下绘制箭头的方法:

public static void drawArrow(Graphics g, Color color, int size, 
        Coordinate from, Coordinate to, Coordinate offset) {
    Graphics2D g2 = (Graphics2D) g.create();

    g2.setColor(color);

    double dx = to.x - from.x, dy = to.y - from.y;
    double angle = Math.atan2(dy, dx);
    int len = (int) Math.sqrt(dx*dx + dy*dy);
    AffineTransform at = AffineTransform.getTranslateInstance(from.x + offset.x, from.y + offset.y);
    at.concatenate(AffineTransform.getRotateInstance(angle));
    g2.transform(at);

    // Draw horizontal arrow starting in (0, 0)
    g2.drawLine(0, 0, len, 0);
    g2.fillPolygon(new int[] {len, len-size, len-size, len},
            new int[] {0, -size, size, 0}, 4);
}

我从 aioobe here的答案中得到了箭头代码的基本要素。

我通过覆盖Edge的{​​{1}}函数来实现此方法:

paintComponent

@Override public void paintComponent(Graphics g) { double radius = this.from.getRadius(); Coordinate vector = this.from.getPosition().clone(); vector.normalize(); vector.x = vector.x * radius; vector.y = vector.y * radius; Coordinate to = new Coordinate(this.to.getPosition().x - vector.x, this.to.getPosition().y - vector.y); GraphicsUtils.drawArrow(g, this.color, ARROW_SIZE, this.from.getPosition(), to, new Coordinate(radius, radius)); } 方法执行它应该的操作时,它会从a到b绘制一个箭头,我想改变我在上面方法中调用它的方式。例如,通过使用drawArrow方法的偏移参数或类似的东西。

drawArrow类:

Coordinate

我当前输出的屏幕截图:

Directed graph

请注意,从D到E和E到D都有箭头。后者没有显示,因为箭头位于D的圆圈后面。

现在要明确,问题是:

public class Coordinate { public double x; public double y; ... public void normalize() { double length = Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2)); this.x = this.x / length; this.y = this.y / length; } ... } - 方法中,我取圆的半径并将其与规范化(参见方法)向量相乘。这会给我一个圆的圆周点,但似乎总是会产生左上角,这是我没有得到的。我想计算最靠近源顶点的圆周上的点。

像这样:

http://www.onemotion.com/flash/sketch-paint/

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您可以根据顶点中心坐标和顶点图像半径计算箭头端点。如果(xa,ya)和(xb,yb)是两个顶点a和b的中心,并且顶点是用半径r绘制的,则a到a的有向线可以表示为

x = xa + t*(xb - xa)
y = ya + t*(yb - ya)

对于从0到1变化的参数t。因为t == 1对应于距离d = sqrt((xb-xa) 2 +(yb-ya) 2 ),你只需要评估上面的t = r / d和t =(dr)/ d。 (不需要触发。)