/* * Checks whether two lines intersect or not * @see http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/ * adapted from line_line_intersection */ std::pair<int, int> FlatRay::IntersectsRatio(const FlatRay &that) const { std::pair<int, int> r; r.second = vector.CrossProduct(that.vector); if (r.second == 0) // lines are parallel return r; const FlatGeoPoint delta = that.point - point; r.first = delta.CrossProduct(that.vector); if ((sgn(r.first) * sgn(r.second) < 0) || (abs(r.first) > abs(r.second))) { // outside first line r.second = 0; return r; } const int ub = delta.CrossProduct(vector); if ((sgn(ub) * sgn(r.second) < 0) || (abs(ub) > abs(r.second))) { // outside second line r.second = 0; return r; } // inside both lines return r; }
bool FlatTriangleFan::IsInside(FlatGeoPoint p) const { if (!bounding_box.IsInside(p)) return false; bool inside = false; for (auto i = vs.begin(), j = std::prev(vs.end()), end = vs.end(); i != end; j = i++) { if ((i->y > p.y) == (j->y > p.y)) continue; const FlatGeoPoint ji = *j - *i; const FlatGeoPoint pi = p - *i; if (pi.CrossProduct(ji) < 0) inside = !inside; } return inside; }