AffineTransform - PullRequest
       1

AffineTransform

1 голос
/ 03 февраля 2012

Ну, я использую этот код, чтобы нарисовать края моего графика, Если пользователь хочет видеть график в его режиме потока, тогда я рисую стрелки вместо линий, все работает отлично, пока я не изменю размер окна, тогда начальная точка стрелок (x1, y1) перемещается несинхронно с моими узлами, оставляя их не подключенными в то время как drawLine () работает отлично.

это как-то связано с AffineTransform?

(методология рисования стрелок взята из здесь ))

    void drawArrow(Graphics g1, int x1, int y1, int x2, int y2) {
    Graphics2D g = (Graphics2D) g1.create();
    int arrowSize = 5;
    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.setTransform(at);
    g.drawLine(0, 0, len, 0);
    g.setStroke(new BasicStroke(1));
    g.drawLine(len/3, arrowSize , len/3-3*arrowSize, 0);
    g.drawLine(len/3, -arrowSize , len/3-3*arrowSize, 0);
}

тому, кто бродил, как выглядит метод рисования Edge:

    public void paintEdge(Graphics g) {
    Point uCenter = u.getCenter();
    Point vCenter = v.getCenter();
    g.setColor(color);
    Graphics2D g2=(Graphics2D) g;
    g2.setStroke(new BasicStroke(3));
    if (mode==Mode.FLOW) {
        int minx=Math.min(uCenter.x, vCenter.x),miny=Math.min(uCenter.y, vCenter.y);
        int maxx=Math.max(uCenter.x, vCenter.x),maxy=Math.max(uCenter.y, vCenter.y);
        g2.drawString(""+ f + " / " + c,10+minx + (maxx-minx)/2,10+miny+ (maxy- miny)/2);
        drawArrow(g2,uCenter.x, uCenter.y, vCenter.x, vCenter.y);
    } else {
        g2.drawLine(uCenter.x, uCenter.y, vCenter.x, vCenter.y);
    }
    g2.setStroke(new BasicStroke(1));
}

1 Ответ

2 голосов
/ 04 февраля 2012
void drawArrow(Graphics2D g, int x1, int y1, int x2, int y2) {
    AffineTransform prev = g.getTransform();
    int arrowSize = 5;
    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.rotate(angle);
    g.transform(at);
    g.drawLine(0, 0, len, 0);
    g.setStroke(new BasicStroke(1));
    g.drawLine(len/3, arrowSize , len/3-3*arrowSize, 0);
    g.drawLine(len/3, -arrowSize , len/3-3*arrowSize, 0);
    g.setTransform(prev);
}

Вот как это делается для того, кто удивляется.

проблема была в том, что я использовал g.setTransform (at); вместо g.transform (at); это было трудно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...