2012-02-02 42 views
1

那么我使用这段代码来绘制我的图形边缘, 如果用户想在流动模式下看到图形,那么我画箭头代替线条,所有工作都很完美,直到我改变窗口大小,然后箭头开始点(x1,y1)与我的节点不同步地移动而使它们不连通,而drawLine()则完美无缺。AffineTransform

这事做的的AffineTransform?

(绘画方法的箭头从here通过))

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); 
} 

给谁逛到油漆边缘方法看起来怎么样:

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)); 
} 
+0

为了更好地帮助越早,张贴[SSCCE(http://sscce.org/)。 – 2012-02-02 22:54:29

+0

真正的问题在开头提到,代码只是一个插图 – 2012-02-02 22:56:27

+0

in drawArrow你有Graphics2D g =(Graphics2D)g1.create();但我不明白为什么你不会只投它就像你在paintEdge – ghostbust555 2012-02-02 23:02:22

回答

2
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); 这是一个很难的。

相关问题