簡體   English   中英

如何計算具有 3 個坐標點的類的兩個對象之間的距離?

[英]How to calcualate the distance between two Object of a class which have 3 coordinates points?

這是我在 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組的各種操作。

另一種解決方案是通過3DObj object1.dist(object2)計算出這個3DObj到另一個3DObj距離。 在這種情況下,無論如何您都不需要dist變量(同樣,它不是一個對象的特征)。

您不需要3DObjdist成員。 始終在兩個對象實例之間測量距離。 恭敬地,不需要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 個 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());
    }
}

您從未調用過此方法,因此分配給 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 位置,然后計算結果的長度。

例如:

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

我建議你使用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. 我可以很容易地想象,您在教育環境中被分配了這個問題,因此您可能被要求從頭開始構建自己的代碼。

請原諒缺乏格式,從手機發布。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM