解决。
之前我有过一个问题,但是发布得非常糟糕,所以根据更好的规则再次发布。
我想创建一些图形样式,例如此图像:
。
它基于物理定律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类,它包含逻辑。对葡萄牙语的评论表示道歉,但这是一个相当简单的代码,你真的不需要评论才能理解,而且我把它分成了可读的方法。
所以基本上,我的问题是如何按照我上面描述的方式使这些线条互动。
谢谢!
答案 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/但这是我的长期项目,所以它有点大。