template<typename T> boolintersect(pair<T, T> a, pair<T, T> b, pair<T, T> c, pair<T, T> d){ return (cross(b - a, c - a) * cross(b - a, d - a) < 0 && cross(d - c, a - c) * cross(d - c, b - c) < 0) || inLine(a, b, c) || inLine(a, b, d) || inLine(c, d, a) || inLine(c, d, b); }
線段交點
在知道兩個線段相交後,可能還要進一步求交點(記得先把四點共線,也就是兩線段重疊的狀況判掉)。
是兩線段交點,先令 , 是一個純量,接著我們知道 ,而 、、 三點共線,因此:
把 求出來後, 就是 了。
1 2 3 4 5
template<typename T> pair<T, T> intersection(pair<T, T> a, pair<T, T> b, pair<T, T> c, pair<T, T> d){ assert(intersect(a, b, c, d)); return a + cross(a - c, d - c) * (b - a) / cross(d - c, b - a); }
template<typename T> T area(vector<pair<T, T>> p){ T ans = 0; for(int i = 0; i < p.size(); i++) ans += cross(p[i], p[(i + 1) % p.size()]); return ans / 2; }