我在本出版物的上下文中:http: //www.gilbertbernstein.com/resources/booleans2009.pdf
我对我的点坐标应用了量化:所有坐标都是整数,位于 [0, 2 power 20] 中。表示坐标的 C++ 类型是 int64_t。
平面 p 用整数齐次坐标 (a, b, c, d) 表示:
p = { (x, y, z) | ax + by + cz + d = 0 }
点 X 可以表示为 3 个平面 (p, q, r)(提供有效条件,参见出版物)。
我有一个有效的点 X 和一个平面 s。我想知道 X 是在正面、负面还是在 s 上。根据该出版物,我需要计算这些行列式的符号:
| p_a, p_b, p_c, p_d |
| q_a, q_b, p_c, q_d |
| r_a, r_b, p_c, r_d |
| s_a, s_b, p_c, s_d |
和:
| p_a, p_b, p_c|
| q_a, q_b, p_c|
| r_a, r_b, p_c|
量化界限意味着以下界限:
|p_a|, |p_b| and |p_c| < 2 pow 40
和
|p_d| < 2 pow 60
如何准确快速地计算该行列式的符号?使用 BigInt 或任何基于中国剩余定理的东西太慢了(虽然我还没有尝试过 GMP 库)...... 哪些库可以解决这个问题?
线索:
- 简单模拟(http://www.cs.sandia.gov/~samitch/unm_math_579/course_papers/p66_edelsbrunner_simulation_of_simplicity.pdf):我将所有内容都转换为双精度并计算双精度行列式。如果结果的绝对值小于 0.5,我使用另一种方法(比如基于中国剩余定理的方法)。有没有更快更准确的方法?
- 如何转换我的矩阵和/或细分输入网格面,以便来自 Shewchuck 的确切谓词:http ://www.cs.cmu.edu/~quake/robust.html适用?