#java #position #distance #move #point
Вопрос:
У меня есть простой класс 2Dpoints с двумя полями, x и y. Я хочу написать код, чтобы я мог приказать одной точке медленно перемещаться в другую точку, например, чтобы она перемещалась по векторной линии их расстояний. Но я не знаю, как это сделать? Сначала я подумал, что он должен содержать цикл for, чтобы он знал, что он должен двигаться, пока не достигнет другой точки, что-то вроде for(int d=0 ; d
import java.lang.Math.*;
public class Punkt {
private int x;
private int y;
public Punkt(int x, int y) {
this.x=x;
this.y=y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setX(int distance) {
x = x distance;
}
public void setY(int distance) {
y = y distance;
}
public void moveAbout(int dx, int dy) {
x = x dx;
y = y dy;
}
/// method for calculating the distance to another point
public double giveDistance(Punkt otherPoint) {
return Math.sqrt(
(otherPoint.getY() - y) *
(otherPoint.getY() - y)
(otherPoint.getX() - x) *
(otherPoint.getX() - x));
}
}
Комментарии:
1. Пожалуйста, не используйте формы множественного числа для названий классов.
Point
вместоPoints
. это своего рода кросс-ланговское соглашение2. спасибо @AlexanderAlexandrov за совет, я его изменил.
3. Подождите немного, я собираюсь подготовить полный пример на repl)
4. Я думаю, что вы неправильно используете тег «вектор». Тег предназначен для одномерного массива, а не для математического вектора.
5. @NomadMaker О, я не знал, изменил его.
Ответ №1:
Я прокомментировал основные строки:
import static java.lang.Math.*;
/**
* Immutable structure. Functional way
*/
class Point {
public final double x;
public final double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
/**
* Here you are. This is what you want to implement.
* from.moveTo(0.0, to) => from
* from.moveTo(1.0, to) => to
*
* @param by - from 0.0 to 1.0 (from 0% to 100%)
* @param target - move toward target by delta
*/
public Point moveTo(double by, Point target) {
Point delta = target.sub(this);
return add(delta.dot(by));
}
public Point add(Point point) {
return new Point(x point.x, y point.y);
}
public Point sub(Point point) {
return new Point(x - point.x, y - point.y);
}
public Point dot(double v) {
return new Point(v * x, v * y);
}
public double dist(Point point) {
return sub(point).len();
}
public double len() {
return sqrt(x * x y * y);
}
public String toString() {
return x ":" y;
}
}
class Main {
public static void main(String[] args) {
Point source = new Point(2, 3);
Point target = new Point(-4, 9);
// You can utilize the cycle or implement kind of timer to animate something
for (int t = 0; t <= 100; t ) {
System.out.println(source.moveTo(0.01 * t, target));
}
}
}
Комментарии:
1. большое вам спасибо за этот ответ, есть ли способ, которым метод moveTo принимает как тип int, а не двойной? Потому что я должен использовать x и y, например, в таких классах, как Canvas, для таких кодов, как fillOval или drawRect, где параметры должны иметь тип int.
2. Вы можете бросить
double
вint
безопасное место. И, конечно,double by
может быть замененint percent
и преобразован в двойной внутреннийpercent * 0.01
3. Спасибо, я только что научился преобразовывать double в int для рисования и изменил все на double, но я хочу вместо печати точек сделать так, чтобы одна точка переходила в другие, а затем рисовала их. Но почему-то это не работает. Я разместил ниже коды.
4. не забудьте понравиться моим ответам)
5. Я пытался, но там написано: Спасибо за отзыв! Вам нужно не менее 15 репутации, чтобы проголосовать, но ваши отзывы были записаны.
Ответ №2:
@AlexanderAlexandrov Я изменил тип своих переменных на двойной соответственно, теперь в одном из моих классов у меня есть метод givePoints, который использует сканер для запроса пользователя, сколько точек он хочет и каковы координаты, затем он сохраняет их в массив точек с первым элементом всегда(0,0). Другой метод принимает массив точек в качестве параметра и сортирует их в порядке их расстояний до точки(0,0). Эти методы работают идеально. Проблема связана с точками попадания метода. Здесь я хочу сначала создать массив точек, отсортировать их, а затем дать команду своему роботу поразить все точки. робот-объект класса Робот расширяет круг, с положением точки типа, которая сначала находится в точке(0,0)
public void hitThePoints(){
Point[] poi=sortPoints (givePoints()); //Creates a sorted array of points
Point short=new Point(poi[1].getX(),poi[1].getY());
System.out.println(" the nearest point is :");
System.out.println("(" short.getX() "," short.getY() ")");
for(int i=1; i<poi.length;i ){
Point source=robot.position;
Point target=new Point(poi[i].getX(), poi[i].getY());
while(source.getX()!=target.getX() amp;amp;
source.getY()!=target.getY()){
robot.bewegeUm((source.moveTo(0.01,target)).getX(),
(source.moveTo(0.01,target)).getY());
if(source.getX()!=target.getX() amp;amp;
source.getY()!=target.getY()){break;}
System.out.println(source.getX() "," source.getY());
}
}
}