Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何计算一个类中有3个坐标点的两个对象之间的距离?_Java_Oop_Class - Fatal编程技术网

Java 如何计算一个类中有3个坐标点的两个对象之间的距离?

Java 如何计算一个类中有3个坐标点的两个对象之间的距离?,java,oop,class,Java,Oop,Class,这是我在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 =

这是我在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之间的距离?

您从未将
dist
变量指定给
dist()函数的结果。此变量自动指定为0.0,因此显示0.0

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


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

您从未调用过此方法,因此分配给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()
,它破坏了一些封装。请也纠正一下。最好使用返回此值的静态帮助器方法(不一定在同一个类中)。无需维护结果,因为它不会有帮助。

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

例如:

结果将是:

Distance = X+Y+Z;


您不需要
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;
}
在您的主要功能中,您可以使用:

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

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

此外,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。我们调用is 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());
    }
}
我建议你使用

它还内置了距离方法

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

  • 我不知道如何检查point3d类是何时引入的,所以在您的操作时它可能不存在

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


  • 请原谅在手机上发帖时缺少格式。

    发帖前请查看问题预览。另外,在源代码中永远不需要超过一个空白行。答案很好,这可能是最好的解决方法。@sashkello但你的答案是正确的:)我只是重新措辞:)非常感谢:D大家:D
    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);
        }
    }
    
    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());
        }
    }