java - 仿射变换

标签 java user-interface

我用这段代码来绘制我的图的边缘, 如果用户想在 Flow 模式下查看图形,那么我绘制箭头而不是线条,一切都完美,直到我更改窗口大小,然后箭头起点 (x1,y1) 与我的节点不同步移动,使它们保持未连接,而drawLine() 工作完美。

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

对于那些想了解 Paint 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));
}

最佳答案

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); 这很难。

关于java - 仿射变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9121188/

相关文章:

java - 方法不必要地被调用?

java - 如何在放心的框架中中止一个请求?

java - 使用可比或比较器实现 BST

java - 如何将 SOAP XML 解码为 Java 对象

sql-server - 如何根据我连接到的数据库更改 SQL Server Management Studio 的外观?

javascript - 有哪些技术资源可用于学习如何设计漂亮的 Web 界面?

Android:配置更改未更新

java - 使用 MySQL 和 JDBC 准备语句缓存

user-interface - 您的开发 UI 应该与最终产品有多少相似度?

java - java/gwt UI编码-干净的代码