Java 如何获得两点之间的距离并沿直线移动一点以到达另一点
我试图将一个点(100100)移动到另一个点(450500)。为此,我通过减去: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
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问题是如何获得两点之间的距离并沿直线移动一点以到达另一点
,因此,不,答案不是“完全错误”