2015-12-08 63 views
0

我想用箭頭畫一條線。該線可以有任何角度。如何在SWT中實現它?如何在畫布上用SWT中的箭頭畫線

我發現了類似的帖子,但它在AWT。我想將它轉換成SWT。但面臨問題將以下方法轉換爲SWT。特別是在以下行:

at.concatenate(AffineTransform.getRotateInstance(angle)); 

這裏是this post

void drawArrow(Graphics g1, int x1, int y1, int x2, int y2) { 
    Graphics2D g = (Graphics2D) g1.create(); 
    double dx = x2 - x1, dy = y2 - y1; 
    double angle = Math.atan2(dy, dx); 
    int len = (int) Math.sqrt(dx*dx + dy*dy); 
    AffineTransform at = AffineTransform.getTranslateInstance(x1, y1); 
    at.concatenate(AffineTransform.getRotateInstance(angle)); 
    g.transform(at); 

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

[Eclipse的GEF(http://eclipse.org/gef/)可能有一些 –

回答

0

轉換爲SWT答案given here看起來像這樣的方法:

static Path createArrowForLine(Device device, Point fromPoint, double rotationDeg, double length, double wingsAngleDeg) { 
    double ax = fromPoint.x; 
    double ay = fromPoint.y; 
    double radB = Math.toRadians(-rotationDeg + wingsAngleDeg); 
    double radC = Math.toRadians(-rotationDeg - wingsAngleDeg); 
    Path resultPath = new Path(device); 
    resultPath.moveTo((float)(length * Math.cos(radB) + ax), (float)(length * Math.sin(radB) + ay)); 
    resultPath.lineTo((float)ax, (float)ay); 
    resultPath.lineTo((float)(length * Math.cos(radC) + ax), (float)(length * Math.sin(radC) + ay)); 
    return resultPath; 
} 

的SWT路徑API使用float小號而不是double,因此演員。

要繪製使用上述方法在畫布上的箭頭,將使用這個代碼:

Canvas canvas = new Canvas(parent, SWT.NONE); 
shell.addPaintListener(new PaintListener() { 
    @Override 
    public void paintControl(PaintEvent event) { 
    event.gc.setBackground(event.display.getSystemColor(SWT.COLOR_RED)); 
    Path path = createArrowForLine(event.display, new Point(100, 100), 180, 100, 45); 
    event.gc.fillPath(path); 
    path.dispose(); 
    } 
}); 
+0

我需要旋轉,使箭頭的三角形上線正確繪製動態變換。我需要將我的問題鏈接中接受的答案轉換爲SWT。 – mantiq

+0

使用'rotationDeg'參數,可以旋轉箭頭。這不是你要找的東西嗎? –

+0

不,該方法應該從座標點和座標點座標2點。輸出是帶箭頭的指示線。在我的問題中描述的鏈接接受的答案是否如此。 – mantiq

1

在這裏,沿箭頭方向,從行的方向上進行計算。我也爲線添加了一個偏移量,以便它不通過箭頭。這在更高的筆劃寬度下更明顯。

public static void drawArrow(GC gc, int x1, int y1, int x2, int y2, double arrowLength, double arrowAngle) { 
    double theta = Math.atan2(y2 - y1, x2 - x1); 
    double offset = (arrowLength - 2) * Math.cos(arrowAngle); 

    gc.drawLine(x1, y1, (int)(x2 - offset * Math.cos(theta)), (int)(y2 - offset * Math.sin(theta))); 

    Path path = new Path(gc.getDevice()); 
    path.moveTo((float)(x2 - arrowLength * Math.cos(theta - arrowAngle)), (float)(y2 - arrowLength * Math.sin(theta - arrowAngle))); 
    path.lineTo((float)x2, (float)y2); 
    path.lineTo((float)(x2 - arrowLength * Math.cos(theta + arrowAngle)), (float)(y2 - arrowLength * Math.sin(theta + arrowAngle))); 
    path.close(); 

    gc.fillPath(path); 

    path.dispose(); 
} 

... 

gc.setLineWidth(1); 
gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK)); 
gc.setBackground(display.getSystemColor(SWT.COLOR_BLACK)); 
drawArrow(gc, x1, y1, x2, y2, 8, Math.toRadians(40));