我可以在 JFrame(JPanel) 中沿 y=0、x=0、y=x 和 y=-x 以外的行移动对象吗?

Can I move objects in a JFrame(JPanel) along lines other than y=0, x=0, y=x and y=-x?

我想制作一个程序,在 circle/square 中绘制从 JPanel 中心移出的给定数量的点,直至无穷大。例如10个点,第一条线与y=0线成0度,第二条是36度,72, 108...

我的问题是点的坐标是整数,当我使用 Math.tan 时,它会将 dX 和 dY 舍入为 0 或 1。

dX = x2 - x1, dY = y2 - y1

例如,我想沿着与 y=0 线成 30 度角的线移动一个点。那个度数的切线是 sqrt(3)/3。 dX 始终为 1 或 -1,因此 dY 将在 +/-0,71 左右,因此它将四舍五入为 1/-1,我将得到另一条 y=x 线,45 度。

如果我降级我的程序以将点移动到某个时刻,我将能够搜索每个点的终点,然后我将能够为它们的移动编写一个函数来创建一条线.我可以沿着这些线移动点吗?

您正在寻找一种叫做画线算法的算法,有多种算法可以让您获得不同程度的线条平滑度,您可以在维基页面 here.

上阅读相关内容

在您的情况下,您不想完全绘制线条,这意味着每次在绘制之前确定要绘制的新点时都需要清除缓冲区。

Bresenham 应该给你好看的线条而不是那么复杂,你可以完整地查看它 here

这会以 double 精度移动一个点:

public class PointMove extends JPanel {

    double r = 200;
    double theta = Math.PI / 4;

    public OpenTets() {

        new Timer(1, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                r = r + 0.05;
                repaint();
            }
        }).start();
    }

    @Override
    protected void paintComponent(Graphics g) {

        super.paintComponent(g);
        double x = r * Math.cos(theta);
        double y = r * Math.sin(theta);
        Graphics2D g2d = ((Graphics2D) g);
        g2d.fill(new Ellipse2D.Double(x, y, 5, 5));
    }
}

例如,将此组件添加到足够大小的 JFrame

想法是使用 Graphics2D.draw(Shape) 并使用 Double 精度形状(these 之一)来表示一个点。