如何在Java中绘制交互式Graph / Lines?

时间:2014-01-07 20:37:31

标签: java graph physics

解决。

之前我有过一个问题,但是发布得非常糟糕,所以根据更好的规则再次发布。

我想创建一些图形样式,例如此图像:

enter image description here

它基于物理定律Snell's Law。到目前为止,我已经设法使用基本的Line2D.Double绘制自己的图形,您可以看到here (Line.java)。然后我需要做的就是,在接口类中,将行添加到该类中的数组中,如下所示:

LinesArray.addLine(150 , 25 , 150 , 275);

每次添加新内容时,都会重新绘制,如代码示例中所示。

但问题是我不知道如何使这种互动。我想让它变得互动,因为你实际上可以移动那些线,同时你移动第一条线,第二条线会相应地移动到Snell定律公式,即:

  

n1 * sin(a1)= n2 * sin(a2)

     

考虑到a1是第一个(左)角,a2是第一个图像中的第二个(右)角。

我希望实现的一个完美例子是this one。 如果交互式运动太难(我是2天的时间表),this example也是可能的。

如果我错了,请纠正我,但对于第二个,我需要做的就是计算鼠标的坐标并从那里绘制和计算所有内容。

Here (menu_ui.java)是我的接口类,我正在使用这些行的方法是“menuSnell()”,而here (Snell.java是我的Snell类,它包含逻辑。对葡萄牙语的评论表示道歉,但这是一个相当简单的代码,你真的不需要评论才能理解,而且我把它分成了可读的方法。

所以基本上,我的问题是如何按照我上面描述的方式使这些线条互动。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不是图形专家,但很久以前我也做过类似的工作。我有一个需要重绘的物体。我创建了自己的JPanel,它保存了我应该绘制的对象。每当有什么变化时,我都会在JPanel上调用重绘方法。看起来像这样 http://sourceforge.net/p/scribbler-cvut/code/132/tree/Tuzka/src/cz/cvut/scribbler/panel/RewritableGlassPane.java

private LinkedList<ColoredArea> background = new LinkedList<ColoredArea>();
/**
 * Vykreslí všechny položky v senamu vykreslených obrazců
 * @param g2d grafika k vykreslení
 */
public void paintShape(Graphics2D g2d) {
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
    for (ColoredArea area : background) {
        area.fill(g2d);
    }
    if (mouse != null && !block) {
        g2d.setColor(mouse_color);
        g2d.draw(mouse);
    }
    if (point!=null){
        SetPointsDialog.paintPoints(point, maxPoint, parent.getChildsSize(), g2d);
    }
}

@Override
public void paint(Graphics g) {
    paintShape((Graphics2D) g);
}

@Override
protected void paintComponent(Graphics g) {
    paintShape((Graphics2D) g);
}

我需要绘制的所有内容都存储在后台变量中。当LinkedList发生变化时,我在窗口上调用了repaint()方法。

我在这里有一个完整的源代码存储:http://sourceforge.net/projects/scribbler-cvut/但这是我的长期项目,所以它有点大。