2014-05-15 41 views
-2

你能帮助我,我怎么可以设定此:绘图用Java(模拟器)

我有一个JPanel作为图形区,我要生成从画线,我有一个随机的距离,一个随机阿尔法。 问题在于第一个点是在这个jPanel中,第二个是从这个jPanel出来的。 我想画的休息线,从另一部分,该图像解释一下我想做的事:

Simulation example

测试是:

if(y1<0){ 
     tmp_x=x1; 
     tmp_y=y1; 
     x1= (x1-(Math.abs(y1)*(x1-x))/(Math.abs(y-y1))); 
     y1=0; 
     g.drawLine(x, y, x1, y1); 
     System.out.println("(x,y);(x1,y1): ("+x+","+y+");"+"("+x1+","+y1+")"); 
     x=x1; 
     y=jPanel1.getHeight(); 
     x1=tmp_x; 
     y1=jPanel1.getHeight()-Math.abs(tmp_y); 
    } 
if(y1>jPanel1.getHeight()){ 
     tmp_x=x1; 
     tmp_y=y1; 
     x1=x1-(Math.abs(Math.abs(y1-y)-Math.abs(y1-jPanel1.getHeight())))*(x1-x)/(Math.abs(y1-y)); 
     y1=jPanel1.getHeight(); 
     g.drawLine(x, y, x1, y1); 
     System.out.println("(x,y);(x1,y1): ("+x+","+y+");"+"("+x1+","+y1+")"); 
     x=x1; 
     y=0; 
     x1=tmp_x; 
     y1=tmp_y-jPanel1.getHeight(); 
    } 

    if(x1<0){ 
     tmp_x=x1; 
     tmp_y=y1; 
     y1= (y1-(Math.abs(x1)*(y1-y))/(Math.abs(x-x1))); 
     x1=0; 
     g.drawLine(x, y, x1, y1); 
     System.out.println("(x,y);(x1,y1): ("+x+","+y+");"+"("+x1+","+y1+")"); 
     y=y1; 
     x=jPanel1.getWidth(); 
     y1=tmp_y; 
     x1=jPanel1.getWidth()-Math.abs(tmp_x); 
    } 

    if(x1>jPanel1.getWidth()){ 
     tmp_x=x1; 
     tmp_y=y1; 
     y1=y1-(Math.abs(Math.abs(x1-x)-Math.abs(x1-jPanel1.getWidth())))*(y1-y)/(Math.abs(x1-x)); 
     x1=jPanel1.getWidth(); 
     g.drawLine(x, y, x1, y1); 
     System.out.println("(x,y);(x1,y1): ("+x+","+y+");"+"("+x1+","+y1+")"); 
     y=y1; 
     x=0; 
     y1=tmp_y; 
     x1=tmp_x-jPanel1.getWidth(); 

    } 

问题出在哪里?

+2

http://stackoverflow.com/help/mcve在这里会非常有帮助。 – Marco13

回答

0

使用Graphic对象,您可以在画布的实际大小之外绘制一条结束(或开始)的直线。 Graphics对象具有理论上无限的表面,所以你可以绘制任何地方。

例如,你可以这样做:

import java.awt.Color; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main extends JPanel { 

    public static void main(String[] args) { 

     JFrame frm = new JFrame(); 

     frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frm.setSize(200, 200); 

     frm.setVisible(true); 

     JPanel p = new Main(); 

     frm.add(p); 

    } 

    @Override 
    public void paint(Graphics g) { 
     super.paint(g); 

     // Start outside 
     g.setColor(Color.RED); 
     g.drawLine(0, -100, 100, 100); 

     // End outside 
     g.setColor(Color.BLUE); 
     g.drawLine(100, 100, 0, 300); 

     // Start and end outside 
     g.setColor(Color.GREEN); 
     g.drawLine(-100, 100, 100, 100); 
    } 

} 

另外请注意,你的代码有许多错误,比如你正在检查只有一个轴在外面,但两者都可以在同一时间在外面。如果全部都在外面,例如(-100,-100) - >(-200,-200),会发生什么?

你仍然可以做到,但你需要更多的检查。表格示例:

  • 检查两个点(段的极值)是否与边界不相交。然后正常绘制。
  • 检查一个是否在里面而另一个不在。然后检查边界与线段的交点并使用该点。
  • 检查两者是否都在外面。然后,您必须再次计算交点,但请记住,您可以获得0,1或2个交点(如果完全在外= 0,如果只触摸一个角= 1并且如果它跨越了entery square = 2)。