Java绘图(模拟器)

Java绘图(模拟器),java,draw,simulation,lines,Java,Draw,Simulation,Lines,你能帮我如何编程吗: 我有一个jPanel作为图形区域,我想从绘图中生成一条线,我有一个随机距离和一个随机alpha。 问题是第一条线的点在这个jPanel中,第二条线的点在这个jPanel中。 我想画一条线,从另一部分开始,这幅图解释了我想做的事情: 测试包括: if(y1<0){ tmp_x=x1; tmp_y=y1; x1= (x1-(Math.abs(y1)*(x1-x))/(Math.abs(y-y1))); y1

你能帮我如何编程吗:

我有一个jPanel作为图形区域,我想从绘图中生成一条线,我有一个随机距离和一个随机alpha。 问题是第一条线的点在这个jPanel中,第二条线的点在这个jPanel中。 我想画一条线,从另一部分开始,这幅图解释了我想做的事情:

测试包括:

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();

    }
if(y1jPanel1.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、 抽绳(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(x1jPanel1.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、 抽绳(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();
}

问题出在哪里?

使用图形对象,您可以绘制一条超出画布实际大小的线。图形对象具有理论上的无限曲面,因此可以在任何位置绘制

例如,您可以执行以下操作:

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,并且如果它穿过入口正方形=2)
A在这里会非常有用。