Search code examples
javapositiondistancemovepoint

In Java how should I command a 2D point to move along the vector line of distance to another point?


I have a simple class 2Dpoints with two fields, x and y. I want to write a code so that I could command one point to moves slowly to another point, like so that it moves on the vector line of their distances. But I don't know how? I've first thought  that it should contain a for loop so that it would know, it should move till it reaches the other point something like for(int d=0 ; d<distance ; d++) but I don't know how should I then command it so that it would move on the line?

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

Solution

  • I've commented the major lines:

    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