ViewDesignEngine  3.1.0
高性能 CAD 计算几何引擎
interval.h
浏览该文件的文档.
1 #pragma once
2 #include <cmath>
3 #include <limits>
4 #include <algorithm>
5 
6 namespace vde::foundation {
7 
20 class Interval {
21 public:
22  double lo, hi;
23 
25  Interval() : lo(0), hi(0) {}
26 
31  Interval(double v) : lo(v), hi(v) {}
32 
41  Interval(double l, double h) : lo(std::min(l,h)), hi(std::max(l,h)) {}
42 
47  [[nodiscard]] double mid() const { return (lo + hi) * 0.5; }
48 
53  [[nodiscard]] double width() const { return hi - lo; }
54 
60  [[nodiscard]] bool contains(double v) const { return lo <= v && v <= hi; }
61 
67  [[nodiscard]] bool is_exact(double eps = 1e-12) const { return width() < eps; }
68 
74  [[nodiscard]] bool overlaps(const Interval& o) const {
75  return !(hi < o.lo || o.hi < lo);
76  }
77 
96  [[nodiscard]] int cmp(const Interval& o) const {
97  if (hi < o.lo) return -1; // 确定 this < o
98  if (lo > o.hi) return 1; // 确定 this > o
99  return 0; // 不确定(区间重叠)
100  }
101 
102  // ── 算术运算 ──
103 
108  Interval operator+(const Interval& o) const {
109  return {lo + o.lo, hi + o.hi};
110  }
111 
116  Interval operator-(const Interval& o) const {
117  return {lo - o.hi, hi - o.lo};
118  }
119 
127  Interval operator*(const Interval& o) const {
128  double a = lo*o.lo, b = lo*o.hi, c = hi*o.lo, d = hi*o.hi;
129  return {std::min({a,b,c,d}), std::max({a,b,c,d})};
130  }
131 
139  Interval operator/(const Interval& o) const {
140  if (o.lo <= 0 && o.hi >= 0) return {-std::numeric_limits<double>::max(),
141  std::numeric_limits<double>::max()};
142  double a = lo/o.lo, b = lo/o.hi, c = hi/o.lo, d = hi/o.hi;
143  return {std::min({a,b,c,d}), std::max({a,b,c,d})};
144  }
145 
147  Interval operator-() const { return {-hi, -lo}; }
148 
149  // ── 数学函数(保守区间)──
150 
158  [[nodiscard]] Interval sqrt() const {
159  return {std::sqrt(std::max(0.0, lo)), std::sqrt(std::max(0.0, hi))};
160  }
161 
169  static Interval from_double(double v, double error = 0) {
170  return {v - error, v + error};
171  }
172 
181  static Interval from_coord(double v) {
182  double eps = std::abs(v) * 2.22e-16 + 1e-300;
183  return {v - eps, v + eps};
184  }
185 };
186 
200 inline Interval orient_2d_interval(double ax, double ay, double bx, double by, double cx, double cy) {
201  Interval acx = Interval::from_coord(ax - cx);
202  Interval acy = Interval::from_coord(ay - cy);
203  Interval bcx = Interval::from_coord(bx - cx);
204  Interval bcy = Interval::from_coord(by - cy);
205  return acx * bcy - acy * bcx;
206 }
207 
232 inline int orient_2d_verified(double ax, double ay, double bx, double by, double cx, double cy) {
233  Interval det = orient_2d_interval(ax, ay, bx, by, cx, cy);
234  return det.cmp(Interval(0.0));
235 }
236 
237 } // namespace vde::foundation
双精度区间算术类
Definition: interval.h:20
bool contains(double v) const
判断区间是否包含给定值
Definition: interval.h:60
Interval operator+(const Interval &o) const
区间加法
Definition: interval.h:108
double width() const
区间宽度
Definition: interval.h:53
Interval()
默认构造:空区间 [0, 0]
Definition: interval.h:25
Interval(double l, double h)
从上下界构造区间
Definition: interval.h:41
bool is_exact(double eps=1e-12) const
判断区间是否足够窄(收敛)
Definition: interval.h:67
static Interval from_double(double v, double error=0)
从双精度值创建区间(含舍入误差带)
Definition: interval.h:169
Interval(double v)
从单值构造精确区间(退化为点)
Definition: interval.h:31
double mid() const
区间中点
Definition: interval.h:47
bool overlaps(const Interval &o) const
判断两个区间是否有重叠
Definition: interval.h:74
Interval operator*(const Interval &o) const
区间乘法
Definition: interval.h:127
static Interval from_coord(double v)
从坐标值创建区间(含 ULP 误差带)
Definition: interval.h:181
Interval operator/(const Interval &o) const
区间除法
Definition: interval.h:139
Interval operator-() const
取负
Definition: interval.h:147
int cmp(const Interval &o) const
确定性区间比较
Definition: interval.h:96
Interval operator-(const Interval &o) const
区间减法
Definition: interval.h:116
Interval sqrt() const
区间平方根
Definition: interval.h:158
Interval orient_2d_interval(double ax, double ay, double bx, double by, double cx, double cy)
二维定向行列式的区间验证
Definition: interval.h:200
int orient_2d_verified(double ax, double ay, double bx, double by, double cx, double cy)
使用区间算术验证 orient_2d 结果
Definition: interval.h:232
自适应双精度谓词后端(默认)
Definition: error_codes.h:4