2014-05-15 39 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)。