首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AffineTransform

AffineTransform
EN

Stack Overflow用户
提问于 2012-02-03 06:49:27
回答 1查看 608关注 0票数 1

好吧,我使用这段代码来绘制我的图的边,如果用户想要在它的流动模式下看到图,我画箭头而不是线,所有的工作都很完美,直到我改变窗口大小,然后箭头的起点(x1,y1)与我的节点不同步地移动,使它们没有连接,而drawLine()工作得很完美。

这跟AffineTransform有什么关系吗?

(箭头画法取自here)

代码语言:javascript
复制
    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);
}

对于那些漫步于paint Edge方法外观的人:

代码语言:javascript
复制
    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));
}
EN

回答 1

Stack Overflow用户

发布于 2012-02-04 06:48:53

代码语言:javascript
复制
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);这是一个很难的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9121188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档