试图计算两个物体的位置之间的距离

时间:2015-11-01 14:00:42

标签: java

我有两个在对象的构造函数中设置的实例变量:

    (int)(Math.random()*100);

两个实例变量是:

    private double xPos;
    private double yPos;

这个类叫做Soldier,我有另外三个继承自Soldier的类,(目前只有构造函数)

我现在得到的输出是:

我的名字是:骑士我在位置:(45.0,56.0)

我的名字是:弩手我位于:(15.0,91.0)

我的名字是:Halberdier我的位置:(67.0,8.0)

我正在尝试计算物体x和y位置的距离

我目前正在尝试的方法是:

    protected Soldier distanceBetween(Soldier x, Soldier y){
        double distBetween = (x.xPos - y.xPos)+(x.yPos-y.yPos);
        return this;

    }

我想要实现的方法是将两个从Soldier继承的对象带入distBetween参数之间, 例如我使用的名称: 戟兵, 骑士和 弩手。

当我称这种方法时:

    cavalier.distanceBetween(cavalier,crossbowman);

我希望它计算x和y坐标之间的距离

我将如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

完全错了。

你需要返回一个值,而不是一个士兵。

这更通用:

public static double distanceBetween(double x1, double y1, double x2, double y2) {
    double dx = Math.abs(x2-x1);
    double dy = Math.abs(y2-y1); 
    if (dx > dy) {
        double r = dy/dx;
        return dx*Math.sqrt(1.0 + r*r); 
    } else {
        double r = dx/dy;
        return dy*Math.sqrt(1.0 + r*r); 
    }
}

^运算符不是取幂;它是XOR。

您可以这样覆盖此方法:

public static double distanceBetween(Soldier s1, Solder s2) {
    return distanceBetween(s1.xPos, s1.yPos, s2.xPos, s2.yPos);
}

由于你遇到麻烦,我会为你拼出来:

/**
 * Distance calc
 * User: mduffy
 * Date: 11/1/2015
 * Time: 9:58 AM
 * @link http://stackoverflow.com/questions/33462961/trying-to-calculate-the-distance-between-the-position-of-two-objects/33463222?noredirect=1#comment54712511_33463222
 */
public class Soldier {

    public final double xPos;
    public final double yPos;

    public static void main(String[] args) {
        Soldier s = new Soldier(0, 0);
        Cavalier c = new Cavalier(3, 4);
        System.out.println(String.format("distance: %f10.3", s.distanceBetween(c)));
    }

    public Soldier(double xPos, double yPos) {
        this.xPos = xPos;
        this.yPos = yPos;
    }

    public double distanceBetween(Soldier s) {
        return distanceBetween(this.xPos, this.yPos, s.xPos, s.yPos);
    }

    public static double distanceBetween(double x1, double y1, double x2, double y2) {
        double dx = Math.abs(x2-x1);
        double dy = Math.abs(y2-y1);
        if (dx > dy) {
            double r = dy/dx;
            return dx*Math.sqrt(1.0 + r*r);
        } else {
            double r = dx/dy;
            return dy*Math.sqrt(1.0 + r*r);
        }
    }

    public static double distanceBetween(Soldier s1, Soldier s2) {
        return distanceBetween(s1.xPos, s1.yPos, s2.xPos, s2.yPos);
    }
}

class Cavalier extends Soldier {
    public Cavalier(double x, double y) {
        super(x, y);
    }
}

如果你想要不同的距离计算方法(例如欧几里得,曼哈顿,皮尔逊,球形等),你可以有一个界面,让你通过添加一个新的实现来改变它:

public interface DistanceCalculator {
    double distance(double x1, double y1, double x2, double y2);
}

现在,您可以通过添加新代码轻松切换,而不是修改现有代码。

答案 1 :(得分:1)

你需要在士兵类中使用类似这个成员函数的东西。

public double ManhattanDistance (Soldier other)
{
    return Math.Abs(this.xPos - other.xPos) + Math.Abs(this.xPos - other.xPos);
}

如果你想要笛卡尔 - 乌鸦 - 距离你需要这个成员函数。

public double Distance (Soldier other)
{   
    double dx = (this.xPos - other.xPos);
    double dy = (this.yPos - other.yPos);
    return Math.Sqrt(dx*dx + dy*dy);
}

要使用这些成员函数来获取cavaliercrossbowman之间的距离,就可以执行此类操作。

 double howFar = cavalier.Distance(crossbowman);

 double howManyBlocks = crossbowman.ManhattanDistance(cavalier);

答案 2 :(得分:0)

你必须想象一个直角三角形ABC。您有A(45.0,56.0)和C(15.0,91.0)的坐标。你必须首先得到B的坐标,它是正确的角度。

B的坐标是

  

(45.0,91.0)

所以AC将是:

Math.sqrt(Math.pow(91-56)+Math.pow(45-15))

enter image description here