原理:
1.根据解析几何原理,三向量共面有:\(r=x v_1+y v_2,x\in R,y\in R \dots 1\)
2. 特殊情况下,r 与 \(v_1或v_2\)共线(假设为\(v_1\)),则上式可转换为:
- \((1+x)r=y v_2\rightarrow v_1=\frac{1+x}{y}v_2 \dots 2\)。
- 显然,对于任意的r和\(v_2\),不管 x或y 取何值,总有一个对应的y或x与之对应,使得上式成立。
- 一般情况下,这是一个二元方程且只有一个关系式(在实数域内有效)。在计算机编成中,对于连续值测试基本不可能。
- 变换:
1. 将式1除以y,得:\(\frac{1}{y}r=\frac{x}{y}v_1+v_2 \dots 3\)
2. 由于:\(\frac{1}{y}r\) 与r共线,所以要证明三向量共面,只需要:\(r=x v_1+v_2 \dots 4\)
3. 于是,只需要:\(x=\frac{v_1}{r+v_2}\)
实现
- 实现
template<size_t D,typename T>
static bool coplane(glm::vec<D,T> const& v1,glm::vec<D,T> const& v2,glm::vec<D,T> const& v3) noexcept
{
auto tv1 { v3 + v2 };
return collineation(tv1,v1);
}