struct Point{ double x, y; Point(double _x=0, double _y = 0){ x = _x, y = _y; } Point operator + (const Point& a){ return Point(x + a.x, y + a.y); } Point operator - (const Point& a){ return Point(x - a.x, y - a.y); } double operator * (const Point& a){ return x * a.x + y * a.y; } Point operator * (const double& a){ return Point(a * x, a * y); } Point operator / (const double& a){ return Point(a / x, a / y); } double operator ^ (const Point& a){ return a.y * x - a.x * y; }}typedef Point Vector;
这样,我们定义了点与向量,并且重定义了运算符号,如内积与外积。
其中,我们可以使用外积来判断两个向量之间的位置关系:
若 , 则 在 的顺时针方向
若 , 则 在 的逆时针方向
若 , 则 与 共线
如此,我们便可以定义直线 Line
struct Line{ Point x, Point y; double a, b, c; Line(Point _x, Point _y){ x = _x, y = _y; a = _x.y - _y.y; b = _y.x - _x.x; c = _x.x * _y.y - _y.x * _x.y; }}
那么,我们可以这样判断两条直线是否相交:
bool judge(Line p, Line q){ Point a = p.x, b = p.y, c = q.x, d = q.y; if(((b - a) ^ (c - a)) * ((b - a)^(d - a)) < 0 && ((c - d) ^ (c - a)) * ((c - d) ^ (c - b)) < 0) return true; return false;}
讨论
想法、补充,或只是打个招呼。