2

頂点と辺を持つグラフの作成に取り組んでいます。グラフは有向なので、エッジは矢印で表されます。私の問題は、矢印の正しい座標を取得することです。

AVertexは a を持ちCoordinate(以下のクラスを参照)、 anEdgeは aVertexから別の に移動し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の回答から矢印コードの要点を入手しました。

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) が 2 つの頂点 a と b の中心であり、頂点が半径 r で描かれている場合、a から be への有向線は次のように表すことができます。

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

t == 1 は d = sqrt((xb - xa) 2 + (yb - ya) 2 ) の距離に対応するため、t = について上記を評価するだけで済みます。 r / dおよびt =(dr)/ d。(トリガーは必要ありません。)

于 2013-06-05T21:20:06.353 に答える