Почему мой PolyLine продолжает рисовать от начала координат (0,0)?

Я создаю программу RandomWalk. Большая часть программы работает, как и должно быть, однако есть одна серьезная проблема.

Когда рисуется PolyLine, она продолжает принудительно возвращаться к началу координат (0,0) вместо того, где находилась последняя точка. Я пытался увидеть, что я пропускаю / делаю неправильно, но я не могу найти проблему.

Любая помощь будет оценена; если нужна дополнительная информация, просто спросите. Благодарю.

Основной класс

import javax.swing.*;
import java.awt.*;

public class RandomWalk {
    public static void main (String[] args) {

        // Creating main frame
        JFrame main = new JFrame("RandomWalk - Version 1.0");
        main.setSize(800, 800);
        main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        main.setResizable(false);
        main.setLocationRelativeTo(null);

        // Creating content/container panel
        JPanel container = new JPanel();
        container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
        main.setContentPane(container);

        // Creating scene/canvas
        Draw canvas = new Draw();
        canvas.setAlignmentX(Component.CENTER_ALIGNMENT);

        container.add(canvas);

        main.toFront();
        main.setVisible(true);
    }
}

Класс рисования

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Draw extends JPanel {

    // Starting value for i
    public static int i = 1;

    // Increment for line length
    public static int inc = 10;

    // Choose amount of lines/moves
    public static int a = 10000;

    // Arrays for polyline points
    public static int[] xPoints = new int[a];
    public static int[] yPoints = new int[a];

    public Timer timer = new Timer(5, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            xPoints[0] = 400;
            yPoints[0] = 400;

            if (i < a) {

                double r = Math.random();

                if (r < 0.25) {
                    xPoints[i] = xPoints[i - 1] - inc;
                    yPoints[i] = yPoints[i - 1] - 0;
                    i++;
                } else if (r < 0.50) {
                    xPoints[i] = xPoints[i - 1] + inc;
                    yPoints[i] = yPoints[i - 1] + 0;
                    i++;
                } else if (r < 0.75) {
                    yPoints[i] = yPoints[i - 1] - inc;
                    xPoints[i] = xPoints[i - 1] - 0;
                    i++;
                } else if (r < 1.00) {
                    yPoints[i] = yPoints[i - 1] + inc;
                    xPoints[i] = xPoints[i - 1] + 0;
                    i++;
                }
                repaint();
            }
        }
    });

    public void paintComponent(Graphics g) {

        timer.start();

        g.drawPolyline(xPoints, yPoints, xPoints.length);
    }
}

1 ответ

Решение

Вы хотите использовать g.drawPolyline(xPoints, yPoints, i); скорее, чем g.drawPolyline(xPoints, yPoints, xPoints.length);,

Это потому, что если вы используете xPoints.length, вы говорите, чтобы использовать весь свой xPoints а также yPoints массивы, даже если вы не инициализировали xPoints[j] а также yPoints[j] для всех j > i (и поэтому они оба 0). Если вы используете i в качестве длины он будет читать только эти массивы до индекса iи все хорошо.

Другие вопросы по тегам