Всем привет. Никак не могу понять как сделать перемещение персонажа из одной точки в другую. Помогите пожалуйста.
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
}
}
Читал несколько статей про нормализованные векторы, но так и не понял как это реализовать. Может быть кто-нибудь более понятным языком объяснит как это сделать. Заранее спасибо.
Дано:
Подготовка:
AB {xb - xa, yb - ya}
. Вектор, по которому будет перемещаться точка.e = AB/|AB|
= {x/|AB|, y/|AB|}
.S = e * speed
.с(1), с(2) .. с(n) - точка, где будет находиться персонаж.
Алгоритм:
если |c(m)B| < speed // где m - текущая итерация
движение по c(m)c(m+1) // c(m) - точка, где сейчас находиться персонаж
иначе движение по c(m)B
Виртуальный выделенный сервер (VDS) становится отличным выбором
Переменные, определяемые в объемлющей области действия лямбда-выражения, доступны в этом выраженииНапример, в лямбда-выражении можно...
Существует ли у border свойство обтекающее фигуру не зависимо от заданных ширины и высоты? ЗЫ