2

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

AVertex有 a Coordinate(见下面的类),而 anEdge从 aVertex到 another 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

我通过覆盖EdgepaintComponent函数来实现这个方法:

@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));
}

由于该drawArrow方法做了它应该做的事情,它绘制了一个从 a 到 b 的箭头,我想改变我在上述方法中调用它的方式。例如,通过使用drawArrow方法或类似方法的偏移参数。

Coordinate班级:

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;
    }
...
}

我当前输出的截图:

有向图

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

现在要清楚,问题是:

paintComponent- 方法中,我取圆的半径并将其与归一化(参见方法)向量相乘。这会给我一个圆的圆周,但似乎总是导致左上角,我没有得到。我想计算最接近源顶点的圆周上的点。

像这样:

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

有什么建议么?

4

1 回答 1

2

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

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。(无需触发。)

于 2013-06-05T21:20:06.353 回答