2015-12-08 2 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

[Затмение GEF] (http://eclipse.org/gef/) может что-то –

ответ

0

Ответ given here переведен на SWT выглядит следующим образом:

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 Path API использует float сек а не double s, следовательно, отливки.

Чтобы нарисовать стрелку на холсте, используя вышеупомянутый метод, вы будете использовать этот код:

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 пунктов fromPoint и toPoint. out put - направленная линия со стрелкой. Принятый ответ ссылки, как описано в моем вопросе, делает это. – 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));