Java 如何获得两点之间的距离并沿直线移动一点以到达另一点

Java 如何获得两点之间的距离并沿直线移动一点以到达另一点,java,swing,math,point,Java,Swing,Math,Point,我试图将一个点(100100)移动到另一个点(450500)。为此,我通过减去:intdx=x2-x1然后减去:intdy=y2-y1得到点之间的距离。我得到1%的dy(dy/100)*1和dx(dx/100)*1的1%。然后我将每个的1%加在x1和y1上,以便沿着JFrame移动该点以到达第二个点 由于某种原因,当我在tick()方法中移动该点时,它忽略了第二个点。我尝试了许多不同的方法来实现这一点。我认为这是一个数学计算错误,或者我在做一些根本错误的事情 这是我的密码: import jav

我试图将一个点(100100)移动到另一个点(450500)。为此,我通过减去:
intdx=x2-x1
然后减去:
intdy=y2-y1
得到点之间的距离。我得到1%的
dy(dy/100)*1
dx(dx/100)*1的1%。然后我将每个的1%加在x1和y1上,以便沿着JFrame移动该点以到达第二个点

由于某种原因,当我在
tick()
方法中移动该点时,它忽略了第二个点。我尝试了许多不同的方法来实现这一点。我认为这是一个数学计算错误,或者我在做一些根本错误的事情

这是我的密码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JFrame;


public class Distance extends JFrame implements Runnable {

    private int x1, y1;
    private int x2, y2;
    private int width, height;

    private int dx, dy;

    public Distance() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(850, 600);
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);

        init();
    }

    private void init() {
        x1 = y1 = 100;
        x2 = 450;
        y2 = 500;
        width = height = 20;

        dx = x2 - x1;
        dy = y2 - y1;

        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillOval(x1, y1, width, height);
        g.fillOval(x2, y2, width, height);
        repaint();
    }

    private void tick() {
        int moveX = (dx / 100) * 1;
        int moveY = (dy / 100) * 1;
        x1 += moveX;
        y1 += moveY;
    }

    @Override
    public void run() {
        while(true) {
            try {
                tick();
                Thread.sleep(100);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        } 
    }

    public static void main(String[] args) {
        new Distance();
    }
}

您应该使用
double
s而不是
int
s,否则将失去精度

由于
fillOval
仅将
int
作为参数,因此必须强制转换它们,但不要担心,这不会影响渲染

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;


public class Distance extends JFrame implements Runnable {

    private double x1, y1;
    private double x2, y2;
    private double width, height;

    private double dx, dy;

    public Distance() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(850, 600);
        setResizable(false);
        setLocationRelativeTo(null);
        setVisible(true);

        init();
    }

    private void init() {
        x1 = y1 = 100;
        x2 = 450;
        y2 = 500;
        width = height = 20;

        dx = x2 - x1;
        dy = y2 - y1;

        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.BLACK);
        g.fillOval((int)x1, (int)y1, (int)width, (int)height);
        g.fillOval((int)x2, (int)y2, (int)width, (int)height);
        repaint();
    }

    private void tick() {
        double moveX = (dx / 100) * 1;
        double moveY = (dy / 100) * 1;
        x1 += moveX;
        y1 += moveY;
    }

    @Override
    public void run() {
        while(true) {
            try {
                tick();
                Thread.sleep(100);
            } catch(InterruptedException e) {
                e.printStackTrace();
            }
        } 
    }

    public static void main(String[] args) {
        new Distance();
    }
}

谢谢:)应该意识到那个完全错误的答案,解释1<代码>重新绘制()内部
绘制
可以创建无限循环,2<代码>重绘
应从自定义代码块中调用到
容器
,3在
21世纪
JPanel
用作
自定义绘制
,4的容器。第一。代码行应为
super.paint(组件)
,5。使用
摆动计时器
,因为
线程睡眠(100)
可以锁定
EDT
,直到
当(true){
结束时,不管是否有
重新绘制
,6个代码对Java 2-3(10-15年前)有效@mKorbel问题是
如何获得两点之间的距离并沿直线移动一点以到达另一点
,因此,不,答案不是“完全错误”