首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 實現四棵樹等距種植:正四面體幾何建模與數值求解

     編輯:程式設計疑難解答

幾何原理

三維空間中,**正四面體**的 4 個頂點兩兩距離相等。邊長為 a,高為 a * sqrt(2/3)。任取一頂點為原點,可構造座標:


P1 = (0, 0, 0)
P2 = (a, 0, 0)
P3 = (a/2, a*sqrt(3)/2, 0)
P4 = (a/2, a*sqrt(3)/6, a*sqrt(6)/3)

Java 實現

1. 點類


public class Point3D {
    double x, y, z;
    public Point3D(double x, double y, double z) { this.x=x; this.y=y; this.z=z; }
    double dist2(Point3D o) {
        double dx=x-o.x, dy=y-o.y, dz=z-o.z;
        return dx*dx + dy*dy + dz*dz;
    }
    @Override public String toString() {
        return String.format("(%.3f, %.3f, %.3f)", x, y, z);
    }
}

2. 正四面體生成器


public class Tetrahedron {
    public static Point3D[] regularTetrahedron(double edge) {
        double h = edge * Math.sqrt(2.0/3.0);
        double r = edge / Math.sqrt(3.0); // 底面外接圓半徑
        return new Point3D[] {
            new Point3D(0, 0, 0),
            new Point3D(edge, 0, 0),
            new Point3D(edge/2, edge*Math.sqrt(3)/2, 0),
            new Point3D(edge/2, edge*Math.sqrt(3)/6, h)
        };
    }

    public static void verify(Point3D[] pts) {
        for (int i=0;i<4;i++)
            for (int j=i+1;j<4;j++)
                System.out.printf("%s <-> %s : %.6f%n", pts[i], pts[j], Math.sqrt(pts[i].dist2(pts[j])));
    }
}

3. 數值搜索替代方案(題目原代碼思路)

若不使用解析解,可在立方體區域內網格搜索滿足距離相等的點組(原代碼用 0.1 步長,-2~2 範圍)。但解析解更精確高效。

運行結果


(0.000, 0.000, 0.000) <-> (1.000, 0.000, 0.000) : 1.000000
(0.000, 0.000, 0.000) <-> (0.500, 0.866, 0.000) : 1.000000
(0.000, 0.000, 0.000) <-> (0.500, 0.289, 0.816) : 1.000000
(1.000, 0.000, 0.000) <-> (0.500, 0.866, 0.000) : 1.000000
(1.000, 0.000, 0.000) <-> (0.500, 0.289, 0.816) : 1.000000
(0.500, 0.866, 0.000) <-> (0.500, 0.289, 0.816) : 1.000000

擴展應用

  • 無線傳感器網絡節點佈局
  • 分子結構模擬(甲烷 CH₄)
  • 三維圖形學測試用例生成

正四面體示意圖

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved