CP Notebook

← all snippets

sideOf

Returns where p is as seen from s towards e. 1/0/-1 Leftrightarrow left/on line/right. If the optional argument eps is given 0 is returned if p is within distance eps from the line. P is supposed to be Point<T> where T is e.g. double or long long. It uses products in intermediate steps so watch out for overflow if using int or long long.

9 lines tested

Usage: bool left = sideOf(p1,p2,q)==1;

Needs: "Point.h"

content/geometry/sideOf.h — Ulf Lundstrom

template<class P>
int sideOf(P s, P e, P p) { return sgn(s.cross(e, p)); }

template<class P>
int sideOf(P s, P e, P p, double eps) {
	auto a = (e-s).cross(p-s);
	double l = (e-s).dist()*eps;
	return (a > l) - (a < -l);
}