【问题标题】:How to calcualate the distance between two Object of a class which have 3 coordinates points?如何计算具有3个坐标点的类的两个对象之间的距离?
【发布时间】:2013-04-21 12:55:49
【问题描述】:

这是我在 3DObj.java 中的类 3DObj。

public class 3DObj {
    private double a;
    private double b;
    private double c;
    public double dist;

    public 3DObj() {

    }

    public 3DObj(double a, double b, double c) {
        this.a = a;
        this.b = b;
        this.c = c;

    }
    public double getA() {
        return a;
    }
    public double getB() {
        return b;
    }
    public double getC() {
        return c;
    }

    public double dist(3DObj p1, 3DObj p2, 3DObj p3) {
        dist = Math.sqrt(Math.pow((p2.a - p1.a), 2)
                         + Math.pow((p2.b - p1.b), 2) 
                         + Math.pow((p2.c - p1.c), 2));
        return dist;
    }

    public double getDist() {
        return dist;
    }
}

下面是我在 3DObjTest.java 中的 3DObjTest 类

public class 3DObjTest {
    public static void main(String[] args) {
        3DObjTest 3DObj1 = new 3DObj(2.5, 2.5, 2.5);
        3DObjTest 3DObj2 = new 3DObj(2.0, 2.2, 3.0);
        System.out.println("Distance is " + 3DObj1.getDist());
    }
}

但它只显示 0.0 而不是任何其他数字。

如何计算 3DObj1 和 3DObj2 之间的距离?

【问题讨论】:

  • 在发布之前查看问题的预览。此外,源代码中永远不需要超过一个空白行。

标签: java oop class


【解决方案1】:

您永远不会将您的 dist 变量分配给您的 dist() 函数的结果。此变量自动分配给 0.0,因此它显示为 0.0。

总而言之,您对此类的设置并不好,因为dist 不是您对象的特征。计算距离的函数应该在另一个类中创建,该类将处理3DObj组上的各种操作。

另一种解决方案是通过object1.dist(object2) 计算此3DObj 到另一个3DObj 的距离。在这种情况下,您无论如何都不需要 dist 变量(同样,它不是一个对象的特征)。

【讨论】:

    【解决方案2】:

    您不需要3DObj 中的dist 成员。始终在两个对象实例之间测量距离。尊敬的,不需要3DObje.getDist()

    你需要修复你的dist()函数:

    public double dist(3DObj arg) {
        double dist = Math.sqrt(Math.pow((this.a - arg.a), 2)
                         + Math.pow((this.b - arg.b), 2) 
                         + Math.pow((this.c - arg.c), 2));
        return dist;
    }
    

    在你的 main 你可以使用:

    System.out.println("Distance is " + 3DObj1.dist(3DObj2));
    

    【讨论】:

    • 很好的答案,这可能是最好的方法。
    • @sashkello 然而你的答案是正确的 :) 我只是改写它:)
    • 非常感谢:D大家:D
    【解决方案3】:

    您应该计算 3DObj 之外的距离。使用您当前的代码,您似乎正在尝试计算 3 个点(p1、p2、p3)之间的距离。您还尝试计算 3DObj 内部的距离,它构成了仅单个数据点(1 个 3D 对象)的蓝图。相反,距离应该从这个类中计算出来。

    此外,a、b、c 属性在 3DObj 中是私有的,因此您应该使用访问器(getA()、getB()、getC())来访问它们。

    这是您编辑的代码。虽然我没有测试它是否有效,但它应该能让您了解需要更改的内容。

    public class 3DObj {
        private double a;
        private double b;
        private double c;
    
        public 3DObj(double a, double b, double c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }
        public double getA() {
            return a;
        }
        public double getB() {
            return b;
        }
        public double getC() {
            return c;
        }
    }
    

    您需要一些其他类来处理多个 3DObj。我们称它为 3DObjCollection,假设它计算两个 3DObj 之间的距离。

    public class 3DObjCollection {
        private 3DObj p1;
        private 3DObj p2;
    
        public 3DObjCollection(3DObj p1, 3DObj p2) {
            this.p1 = p1;
            this.p2 = p2;
        }
    
        public dist() {
            double result = Math.sqrt(Math.pow((p2.getA() - p1.getA()), 2)
                            + Math.pow((p2.getB() - p1.getB()), 2) 
                            + Math.pow((p2.getC() - p1.getC()), 2));
            return(result);
        }
    }
    

    现在,让我们创建测试类 3DObjTest:

    public class 3DObjTest {
        public static void main(String[] args) {
            3DObj p1 = new 3DObj(2,4,6);
            3DObj p2 = new 3DObj(3,4,7);
            3DObjCollection c1 = new 3DObjCollection(p1, p2);
            System.out.println("Distance is " + c1.dist());
        }
    }
    

    【讨论】:

      【解决方案4】:

      你需要用 3DObj1 位置减去 3DObj2 位置,然后计算结果的长度。

      例如:

      X = 3DObj2.x - 3Dobj1.x;
      Y = 3DObj2.y - 3Dobj1.y;
      Z = 3DObj2.z - 3Dobj1.z;
      

      结果是:

      Distance = X+Y+Z;
      

      Distance = sqrt(X*X+Y*Y+Z*Z);
      

      【讨论】:

        【解决方案5】:

        您从未调用过此方法,因此分配给 dist 的默认值是0

        public double dist(3DObj p1, 3DObj p2, 3DObj p3)
        

        为什么这种方法需要 3 个 3D 点?你可以用 2 来计算。

        xdiff = x2-x1
        ydiff = y2-y1
        zdiff = z2-z1
        diff = Math.sqrt(xdiff*xdiff + ydiff*ydiff + zdiff*zdiff)
        

        您的dist 变量是公开的,并且还有一个getter(),它破坏了一些封装。也请更正。您最好使用返回此值的静态辅助方法(不一定在同一个类中)。没有必要维护结果,因为它没有帮助。

        【讨论】:

          【解决方案6】:

          我建议你使用https://docs.oracle.com/cd/E17802_01/j2se/javase/technologies/desktop/java3d/forDevelopers/J3D_1_3_API/j3dapi/javax/vecmath/Point3d.html

          它还内置了一个距离方法。

          此答案附带一些免责声明:

          1. 我不知道如何检查何时引入了 point3d 类,因此在您执行操作时它可能不存在。

          2. 我可以很容易地想象,您在教育环境中被分配了这个问题,因此您可能被要求从头开始构建自己的代码。

          请原谅缺乏格式,从手机发帖。

          【讨论】:

            猜你喜欢
            • 2020-02-12
            • 1970-01-01
            • 1970-01-01
            • 2018-06-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-01-26
            相关资源
            最近更新 更多