頂点と辺を持つグラフの作成に取り組んでいます。グラフは有向なので、エッジは矢印で表されます。私の問題は、矢印の正しい座標を取得することです。
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の回答から矢印コードの要点を入手しました。
Edge
の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));
}
メソッドが想定どおりに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
半径を取り、それを正規化された (メソッドを参照) ベクトルで乗算しています。これで円の円周のポイントが得られますが、常に左上隅になるようですが、取得できません。ソース頂点に最も近い円周上の点を計算したい。
そのようです:
助言がありますか?