Java中带点的Bezier曲线

Java中带点的Bezier曲线,java,graphics,drawing,bezier,Java,Graphics,Drawing,Bezier,我正在尝试制作一个简单的程序,通过随机生成的点绘制曲线。但是出现了一些错误,编译器给出了一个错误。我刚刚开始学习java,这是第一个任务之一。我希望你能指出我的错误。这是密码 public class Framey { private static int fact(int n) { int fact = 1; for(int i = 1; i <= n;i++) { fact *= i; } return fact; } private

我正在尝试制作一个简单的程序,通过随机生成的点绘制曲线。但是出现了一些错误,编译器给出了一个错误。我刚刚开始学习java,这是第一个任务之一。我希望你能指出我的错误。这是密码

public class Framey {

private static int fact(int n) {
    int fact = 1;
    for(int i = 1; i <= n;i++) {
        fact *= i;
    }
    return fact;
}

private static double bernstein(float t,int n,int i) {
    return (fact(n)/(fact(i)*fact(n-i)))*Math.pow(1-t, n-i)*Math.pow(t, i);
}


private JFrame frame;



/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Framey window = new Framey();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Framey() {
    initialize();

}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setLayout(null);

    JPanel panel = new JPanel();
    panel.setBackground(Color.LIGHT_GRAY);
    panel.setBounds(23, 35, 250, 200);
    frame.getContentPane().add(panel);


    JSpinner spinner = new JSpinner();
    spinner.setBounds(291, 113, 30, 20);
    frame.getContentPane().add(spinner);

    JLabel warning = new JLabel("Value cannot be larger than 8!");
    warning.setFont(new Font("Tahoma", Font.BOLD, 9));
    warning.setBounds(283, 144, 141, 53);
    frame.getContentPane().add(warning);
    warning.setVisible(false);

    JButton btnNewButton = new JButton("New button");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            int pointCount;

            pointCount = (int) spinner.getValue();
            if (pointCount>8) {
                warning.setVisible(true);
            }else {warning.setVisible(false);}




            Point[] points = getPoints(pointCount); 

             drawScene(points);
        }
        private  Point[] getPoints(int pointCount) {
            Random val = new Random();
            Point[] points = new Point[pointCount];
            for(int i=0;i<pointCount;i++) {
                points[i].x = val.nextInt(panel.getWidth());
                points[i].y =val.nextInt(panel.getHeight());
            }
            return points;
        }
        private void drawScene(Point[] points) {
            int pWidth = panel.getWidth();
            int pHeight = panel.getHeight();
            Graphics g = panel.getGraphics();
            int pointCount = points.length;
            g.setColor(Color.WHITE);
            g.fillRect(0,0, pWidth, pHeight);

            if(pointCount>1) {
                float t = 0;
                while( t<=1) {
                    g.setColor(Color.DARK_GRAY);
                    besierCurve(t, points);
                    t+=0.001;
                }
            }
        };


        private void besierCurve(float t , Point[] points) {

            Graphics g = panel.getGraphics();
            int pointCount = points.length; 
            double bPoly[] = new double[pointCount];
            for(int i =0;i<pointCount;i++) {
                bPoly[i] = bernstein(t,pointCount-1,i+1);
            }

            double sumX = 0;
            double sumY = 0;
            for(int i=0;i<pointCount;i++) {
                sumX += bPoly[i] * points[i].x;
                sumY += bPoly[i] * points[i].y;
            }

            int x , y;
            x=(int) Math.round(sumX);
            y=(int) Math.round(sumY);
            g.drawLine(x, y, x, y);

        }






    });
公共类框架{
私有静态整数事实(整数n){
int-fact=1;
对于(int i=1;i 8){
警告。设置可见(真);
}else{warning.setVisible(false);}
点[]点=获取点(点计数);
绘画场景(点);
}
私有点[]获取点(int pointCount){
Random val=新的Random();
点[]点=新点[点计数];
对于(int i=0;i1){
浮动t=0;

而(t问题在于您的
getPoints
方法。创建点数组不会创建任何点,它只会创建一个可以存储点引用的空间。但是这些引用最初都是
null
,这就是为什么您会得到
NullPointerException

因此,在尝试分配
x
y
字段之前,需要创建
Point
实例

更改:

points[i].x = val.nextInt(panel.getWidth());
points[i].y =val.nextInt(panel.getHeight());
致:


编译器的错误是什么?它在源代码中指示了哪一行(标记)?如果没有这些信息,您的问题是不完整的,很可能会被关闭。向我们显示错误PLS请详细说明SSCCE是什么。另外,由于您是新来的,请仔细阅读带圆圈的问号菜单中的教程。线程中的异常bezjeLiikne.Framey$2的“AWT-EventQueue-0”java.lang.NullPointerException.getPoints(Framey.java:106)在bezjeLiikne.Framey$2.actionPerformed(Framey.java:98)在java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)在java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)在你的方法中还有一点需要注意:不要使用阶乘,因为当你需要的是二项式系数时,它们是完全不相关的。我们已经知道了一种更简单的计算方法:帕斯卡三角形。预定义(1,2,1)和(1,3,3,1)用于二次和三次Bezier,现在您拥有生成高阶曲线系数所需的所有信息,如果您需要这些信息的话(几乎从来都不是这种情况)。这很有效,但现在出现了另一个问题,即曲线总是朝着坐标原点的方向错误移动。在这里,哪种方法更合适?从
(1-t)^(n-i)*t^i开始,而不是从
(1-t)^i*t^(n-i)
(另外,不要使用阶乘,你不需要它们。事实上,如果你为三次曲线编码,系数是固定的,你甚至不需要那种
bernstein
方法)
points[i] = new Point(val.nextInt(panel.getWidth()), val.nextInt(panel.getHeight());