File size: 3,690 Bytes
1dd0e3b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include "robust_predicates.h"

int main() {
    using namespace hhb::core::predicates;

    // 测试 orient2d
    std::cout << "Testing orient2d..." << std::endl;
    real a2d[2] = {0.0, 0.0};
    real b2d[2] = {1.0, 0.0};
    real c2d_left[2] = {0.5, 1.0};   // 左侧
    real c2d_right[2] = {0.5, -1.0};  // 右侧
    real c2d_colinear[2] = {0.5, 0.0}; // 共线

    int result_left = orient2d(a2d, b2d, c2d_left);
    int result_right = orient2d(a2d, b2d, c2d_right);
    int result_colinear = orient2d(a2d, b2d, c2d_colinear);

    std::cout << "Left point: " << result_left << " (expected: 1)" << std::endl;
    std::cout << "Right point: " << result_right << " (expected: -1)" << std::endl;
    std::cout << "Colinear point: " << result_colinear << " (expected: 0)" << std::endl;

    // 测试 orient3d
    std::cout << "\nTesting orient3d..." << std::endl;
    real a3d[3] = {0.0, 0.0, 0.0};
    real b3d[3] = {1.0, 0.0, 0.0};
    real c3d[3] = {0.0, 1.0, 0.0};
    real d3d_above[3] = {0.0, 0.0, 1.0};   // 上方
    real d3d_below[3] = {0.0, 0.0, -1.0};  // 下方
    real d3d_coplanar[3] = {0.5, 0.5, 0.0}; // 共面

    int result_above = orient3d(a3d, b3d, c3d, d3d_above);
    int result_below = orient3d(a3d, b3d, c3d, d3d_below);
    int result_coplanar = orient3d(a3d, b3d, c3d, d3d_coplanar);

    std::cout << "Above point: " << result_above << " (expected: 1)" << std::endl;
    std::cout << "Below point: " << result_below << " (expected: -1)" << std::endl;
    std::cout << "Coplanar point: " << result_coplanar << " (expected: 0)" << std::endl;

    // 测试 incircle
    std::cout << "\nTesting incircle..." << std::endl;
    real a_circle[2] = {0.0, 0.0};
    real b_circle[2] = {1.0, 0.0};
    real c_circle[2] = {0.0, 1.0};
    real d_circle_inside[2] = {0.25, 0.25};   // 内部
    real d_circle_outside[2] = {1.0, 1.0};     // 外部
    real d_circle_on[2] = {0.5, 0.5};           // 圆上

    int result_inside = incircle(a_circle, b_circle, c_circle, d_circle_inside);
    int result_outside = incircle(a_circle, b_circle, c_circle, d_circle_outside);
    int result_on = incircle(a_circle, b_circle, c_circle, d_circle_on);

    std::cout << "Inside point: " << result_inside << " (expected: 1)" << std::endl;
    std::cout << "Outside point: " << result_outside << " (expected: -1)" << std::endl;
    std::cout << "On circle point: " << result_on << " (expected: 0)" << std::endl;

    // 测试 insphere
    std::cout << "\nTesting insphere..." << std::endl;
    real a_sphere[3] = {0.0, 0.0, 0.0};
    real b_sphere[3] = {1.0, 0.0, 0.0};
    real c_sphere[3] = {0.0, 1.0, 0.0};
    real d_sphere[3] = {0.0, 0.0, 1.0};
    real e_sphere_inside[3] = {0.25, 0.25, 0.25};   // 内部
    real e_sphere_outside[3] = {1.0, 1.0, 1.0};     // 外部

    int result_sphere_inside = insphere(a_sphere, b_sphere, c_sphere, d_sphere, e_sphere_inside);
    int result_sphere_outside = insphere(a_sphere, b_sphere, c_sphere, d_sphere, e_sphere_outside);

    std::cout << "Inside point: " << result_sphere_inside << " (expected: 1)" << std::endl;
    std::cout << "Outside point: " << result_sphere_outside << " (expected: -1)" << std::endl;

    // 测试鲁棒性:处理微小尺度下的浮点误差
    std::cout << "\nTesting robustness..." << std::endl;
    real a_robust[3] = {0.0, 0.0, 0.0};
    real b_robust[3] = {1.0, 0.0, 0.0};
    real c_robust[3] = {0.0, 1.0, 0.0};
    real d_robust[3] = {0.0, 0.0, 1e-16}; // 非常接近共面

    int result_robust = orient3d(a_robust, b_robust, c_robust, d_robust);
    std::cout << "Robust test: " << result_robust << " (expected: 1 or -1, not 0)" << std::endl;

    return 0;
}