В Java, как я должен командовать 2D-точкой для перемещения по векторной линии расстояния до другой точки?

#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));
    }
  }
}
 

https://replit.com/join/sucvdhpqoa-redneckz

Комментарии:

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());
                  
                  }
           }
      }