[英]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
變量(同樣,它不是一個對象的特征)。
您不需要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 個 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);
它還內置了距離方法。
這個答案附帶了一些免責聲明:
我不知道如何檢查 point3d 類是什么時候引入的,所以在你的操作時它可能不存在。
我可以很容易地想象,您在教育環境中被分配了這個問題,因此您可能被要求從頭開始構建自己的代碼。
請原諒缺乏格式,從手機發布。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.