2013-06-05 192 views
2

我正在創建具有頂點和邊的圖形。該圖是有針對性的,所以邊緣被表示爲箭頭。我的問題是得到箭頭的正確座標。將箭頭繪製到圓形

Vertex具有Coordinate(見下文類),而一個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); 
} 

我通過aioobehere接到一個應答箭頭代碼的要領。

我通過重寫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; 
    } 
... 
} 

我的當前輸出的屏幕截圖:

Directed graph

注有兩個箭頭從d到E和E到D後者沒有顯示因爲箭頭在D的後面。

現在要明確,這個問題是:

paintComponent - 方法,這是我在圓的半徑,並與標準化乘以(參見方法)載體。這會給我一個圈的圓周點,但它似乎總是在左上角,我沒有得到。我想計算最接近源頂點的圓周上的點。

像這樣:

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

有什麼建議?

回答

2

您可以根據頂點中心的座標和頂點圖像半徑計算出箭頭端點。如果(XA,YA)和(XB,YB)是兩個頂點a和b的中心,並且所述頂點半徑爲r,然後從一個有向線是可以被表示爲

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

繪製爲一個參數t從0變化到1。由於噸== 1對應於d = SQRT((XB - XA) +(YB - 雅))的距離,你只需要評估上面的t = r/d和t =(dr)/ d。 (不需要觸發。)

+0

這就是我正在做的。如果你看一下'paintComponent'方法,我得到圓的半徑並將其與歸一化的矢量相乘。這會給我一個圈的圓周點,但似乎總是在左上角。我會澄清這個問題。 – mfaerevaag

+0

@ 7SLEVIN - 我還沒有完成所有的代碼,但有一點看起來很可疑,即偏移總是沿着對角線(x和y相等),而不管兩個頂點的位置在哪裏。我建議按照我在答案中描述的方式計算箭頭終點,然後使用最初發布的aioobe代碼(因爲它不處理偏移量)。 –

+0

@TomHopp - 完美!謝謝! – mfaerevaag