0

This is my class 3DObj in 3DObj.java.

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;
    }
}

Below is my 3DObjTest class in 3DObjTest.java

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());
    }
}

but it is only showing 0.0 instead of any other number.

How can I calculate the distance between 3DObj1 and 3DObj2?

4

6 回答 6

4

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

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

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

于 2013-04-21T12:59:04.263 回答
2

您不需要dist. 3DObj始终在两个对象实例之间测量距离。恭敬,不需要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));
于 2013-04-21T13:13:43.193 回答
1

您应该计算 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());
    }
}
于 2013-04-21T13:27:19.397 回答
0

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

于 2013-04-21T13:01:33.920 回答
0

您需要用 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);
于 2013-04-21T13:02:49.730 回答
0

我建议你使用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. 我可以很容易地想象你在教育环境中被分配了这个问题,所以你可能被要求从头开始构建自己的代码。

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

于 2019-12-02T07:21:34.397 回答