【问题标题】:Calculating distance between two points in 3D计算 3D 中两点之间的距离
【发布时间】:2015-08-16 08:58:03
【问题描述】:

我的任务是创建主类,在其中我将任意点的值初始化为 (0,0,0),并且能够单独访问和改变所有三个值 (x,y,z)。为此,我使用了 getter 和 setter。我的下一个任务是在我的主类(我称之为“distanceTo”)中创建一个计算两点之间距离的方法。

如何创建方法“distanceTo”,通过获取 x、y、z 坐标来计算两点之间的距离?我假设我的答案与sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2) 有关,但如果我的点在我的第二个测试点课程之前没有定义,我不知道如何在我的主课程的方法中编写它

到目前为止,我只有两点,但我正在寻找更一般的答案(这样,如果我创建了三个点,p1 p2 和 p3,我可以计算 p1 和 p2 之间的距离或 p2 和 p3 之间的距离或者p1和p3之间的距离。

我的主要课程:

package divingrightin;

public class Point3d {

    private double xCoord;
    private double yCoord;
    private double zCoord;


    public Point3d(double x, double y, double z){
        xCoord = x;
        yCoord = y;
        zCoord = z;
    }

    public Point3d(){
        this (0,0,0);
    }

    public double getxCoord() {
        return xCoord;
    }
    public void setxCoord(double xCoord) {
        this.xCoord = xCoord;
    }
    public double getyCoord() {
        return yCoord;
    }
    public void setyCoord(double yCoord) {
        this.yCoord = yCoord;
    }
    public double getzCoord() {
        return zCoord;
    }
    public void setzCoord(double zCoord) {
        this.zCoord = zCoord;
    }

    //public double distanceTo(double xCoord, double yCoord, double zCoord ){


    }

我的班级有测试点: 包潜水权;

public class TestPoints {

    public static void main(String[] args) {

        Point3d firstPoint = new Point3d();

        firstPoint.setxCoord(2.2);
        firstPoint.setyCoord(1);
        firstPoint.setzCoord(5);

        //System.out.println(firstPoint.getxCoord());

        Point3d secondPoint = new Point3d();

        secondPoint.setxCoord(3.5);
        secondPoint.setyCoord(22);
        secondPoint.setzCoord(20);

    }

}

【问题讨论】:

  • 你想在Point3d 类中有一个 distanceTo 方法。类似:public double distanceTo(Point3d p){ ... } 在那里你可以进行距离计算

标签: java distance getter-setter coordinate euclidean-distance


【解决方案1】:

只需使用 getter

float distance = Math.sqrt(Math.pow(secondPoint.getXCoord() - firstPoint.getXCoord()), 2) + ...)

【讨论】:

  • 这是否意味着我每次创建一个新点并希望计算该点与另一个点之间的距离时都必须创建一个新方法?
  • 看不到 Diego 的回答
【解决方案2】:
public double distanceTo(Point3d other) {
    return Math.sqrt(Math.pow(this.xCoord-other.getxCoord(), 2)
            + Math.pow(this.yCoord-other.getyCoord(), 2)
            + Math.pow(this.zCoord-other.getzCoord(), 2));
}

将此添加到您的 Point3d 类中。当你需要在 TestPoints 类中计算距离时,你可以这样做

double distance = firstPoint.distanceTo(secondPoint);

【讨论】:

    【解决方案3】:

    两个想法。

    添加一个:

    public double distanceTo(Point3d otherPoint) {
       // return distance by using this.getxCoord(), this.getyCoord(), etc.
       // and otherPoint.getxCoord(), otherPoint.getyCoord()
    }
    

    Point3d 类的方法。 然后,在您的 main 方法结束时,您可以:

    System.out.println(firstPoint.distanceTo(secondPoint));
    System.out.println(tenthPoint.distanceTo(ninthPoint));
    

    或者,将静态方法添加到您的主 TestPoints 类:

    public static double distanceBetween(Point3d point1, Point3d point2) {
       // return distance by using point1.getxCoord(), etc. and point2.getxCoord()
    }
    

    然后,在您的 main 方法结束时,您可以这样做:

    System.out.println(distanceBetween(firstPoint, secondPoint));
    System.out.println(distanceBetween(tenthPoint, ninthPoint));
    

    【讨论】:

      【解决方案4】:

      根据您想要实现的目标,您有两种可能的方法。

      您可以将“distanceTo”方法放在 Point3D 类中:

      public class Point3d {
        ...
        public double distanceTo(Point3d ) {
          return Math.sqrt( Math.pow(this.x - that.x, 2) + Math.pow(this.y - that.y, 2) + Math.pow(this.z - that.z, 2));
      }
      

      在这种情况下,您始终使用第一个点作为第一个参数,并将任何其他点作为您要计算距离的点。

      或者,您可以有一个通用的 distanceTo 方法,它存在于某个地方(例如在您的 Program 类中,您有您的 main 方法),它需要两个点并计算它们之间的距离:

      public class Program {
        static public void main(String[] args) {}
        public double distanceTo(Point3d p1, Point3d p2) {
          return Math.sqrt( Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2) + Math.pow(p1.z - p2.z, 2));
        }
      }
      

      哪个更好?取决于您在常见情况下如何使用它们:)

      【讨论】:

      • 也许调用方法更好:that.getxCoord 而不是that.x。如果以后想提供点的接口并且有多个类(极坐标、欧几里得等),这个方法仍然可以工作。
      • 这只是为了一个例子:如果你读了这个问题,OP提供了吸气剂,但你是对的。
      【解决方案5】:

      正如@Dude 在 cmets 中指出的,你应该写一个方法:

      public double distanceTo(Point3d p) {
          return Math.sqrt(Math.pow(x - p.getxCoord(), 2) + Math.pow(y - p.getyCoord(), 2) + Math.pow(z - p.getzCoord(), 2));
      }
      

      那么如果你想得到两点之间的距离,你只需调用:

      myPoint.distanceTo(myOtherPoint);
      //or if you want to get the distance to some x, y, z coords
      myPoint.distanceTo(new Point3d(x,y,z);
      

      您甚至可以将方法设为静态并给它 2 分进行比较:

      public static double getDistance(Point3d p1, Point3d p2) {
          return Math.sqrt(Math.pow(p1.getxCoord() - p2.getxCoord(), 2) + ...
      }
      

      附:我的第一个答案:)

      【讨论】:

      • 有没有办法使用你使用的第一种方法 public double distanceTo(Point3d p) { return Math.sqrt(Math.pow(x - p.getxCoord, 2) + Math.pow(y - p.getyCoord, 2) + Math.pow(z - p.getzCoord, 2));但是通过两个点而不是一个通过,这样我就可以得到任何两个点之间的距离,不仅仅是第一个点和另一个点,还可能是第二个点和另一个点或第 9 点和第 5 点...
      • 是的,如果您使用静态方法,您只需将其写入您的 Point3d 类,然后您可以通过以下方式调用它:Point3d.getDistance(myPoint1, myPoint2); 它将返回两点之间的距离。
      • 如果你想了解更多关于静态字段和方法的信息,你可以联系doc
      • 没问题,很高兴为我的第一个答案提供帮助:P 既然你现在明白了,你应该接受一个答案,这样其他人就会看到你的问题得到了回答 + 以提供一些免费的声誉。由于您像我一样是 SE 新手,因此您可以阅读何时应该 accept 回答。
      • 你不应该调用方法吗(即p.getxCoord()而不是p.getxCoord)?
      猜你喜欢
      • 2019-01-10
      • 1970-01-01
      • 2010-10-30
      • 2011-04-23
      • 2014-11-14
      • 1970-01-01
      相关资源
      最近更新 更多