2014-05-15 2 views
-2

당신은 내가이 프로그램을 수있는 방법을 도와 줄 수 : 나는 임의의 거리를 가지고그리기 자바 (시뮬레이터)에

나는 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

그래픽 개체를 사용하면 캔버스의 실제 크기 밖에서 끝나는 (또는 시작하는) 선을 그릴 수 있습니다. 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 교차점을 얻을 수 있다는 것을 명심해야합니다 (코너를 만지면 1 = 0, 외각이 2 인 경우 = 2).