Перемещение порсонажа [закрыт]

190
09 апреля 2019, 16:40

Всем привет. Никак не могу понять как сделать перемещение персонажа из одной точки в другую. Помогите пожалуйста.

distance возращает расстояние между точками. angle возвращает дирекционный угол линии между точками.

Class Point

package com.main;
public class Point {
private double x, y, z;
private int id;
private String name;

public Point(double x, double y, double z, int id, String name) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.id = id;
    this.name = name;
}
@Override
public String toString() {
    return "Point [x=" + x + ", y=" + y + ", z=" + z + ", id=" + id + ", name=" + name + "]";
}
public double distance(Point p)
{
    double dx = p.getX() - this.x;
    double dy = p.getY() - this.y;
    return Math.sqrt(dx * dx + dy * dy);
}
public double angle(Point p)
{
    double dx = p.getX() - this.x;
    double dy = p.getY() - this.y;
    double r = Math.abs(Math.atan(dy/dx));
    r = radToGrad(r);
    if(dx > 0 && dy > 0)
    {
        return r;
    }
    if(dx < 0 && dy > 0)
    {
        return 180 - r;
    }
    if(dx < 0 && dy < 0)
    {
        return r + 180;
    }
    if(dx > 0 && dy < 0)
    {
        return 360 - r;
    }
    return 0;
}
public double gradToRadian(double angle)
{
    return angle * (Math.PI / 180);
}
public double radToGrad(double angle)
{
    return angle * (180 / Math.PI);
}
public double getX() {
    return x;
}
public void setX(double x) {
    this.x = x;
}
public double getY() {
    return y;
}
public void setY(double y) {
    this.y = y;
}
public double getZ() {
    return z;
}
public void setZ(double z) {
    this.z = z;
}
public double getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}


}

Это класс для теста перемещения. Я пока что еще не продумал как все будет окончательно выглядеть. Но нужно с определенной скоростью speed изменять координаты первой точки p1, до тех пор пока они не будут равны координатам второй точки p2. Но есть несколько проблема: double выдает слишком большую точность и может получиться так, что персонаж будет бесконечно двигаться вокруг точки и никогда в неё не прийдет.

Class Move

public class Move implements Runnable {
private Point p1, p2;
private Thread thread;
private double speed;
public Move(Point p1, Point p2, double speed) {
    this.p1 = p1;
    this.p2 = p2;
    this.speed = speed;
    this.thread = new Thread(this);
    this.thread.start();
}
@Override
public void run() {
    move();
}
private void move()
{
    //TODO
}
}

Читал несколько статей про нормализованные векторы, но так и не понял как это реализовать. Может быть кто-нибудь более понятным языком объяснит как это сделать. Заранее спасибо.

Answer 1

Дано:

  • A и B - точки начала и конца.
  • speed - скорость движения (число).

Подготовка:

  1. Находим вектор движения (AB) AB {xb - xa, yb - ya}. Вектор, по которому будет перемещаться точка.
  2. Орт вектора AB e = AB/|AB| = {x/|AB|, y/|AB|}.
  3. Вектор скорости S S = e * speed.

с(1), с(2) .. с(n) - точка, где будет находиться персонаж.

Алгоритм:

если |c(m)B| < speed         // где m - текущая итерация
    движение по c(m)c(m+1)   // c(m)  - точка, где сейчас находиться персонаж
иначе движение по c(m)B
READ ALSO
Объемлющая область действия

Объемлющая область действия

Переменные, определяемые в объемлющей области действия лямбда-выражения, доступны в этом выраженииНапример, в лямбда-выражении можно...

454
Пульсирующая круглая кнопка

Пульсирующая круглая кнопка

можете подсказать как сделать пульсирующую кнопку?

159
Border обтекающий фигуру

Border обтекающий фигуру

Существует ли у border свойство обтекающее фигуру не зависимо от заданных ширины и высоты? ЗЫ

181