判斷點是否線上段上
阿新 • • 發佈:2020-06-27
給定點 \(Q,P_1,P_2\),問點 \(Q\) 是否線上段 \(P_1P_2\) 上。
首先運用向量的叉積可以很方便地判斷點是否在給定線段的直線上:若 \(Q\) 在直線 \(P_1P_2\) 上,則 \(\overrightarrow{P_1Q}\times \overrightarrow{P_1P_2}=0\)。
然後我們只需要保證點 \(Q\) 在以 \(P_1P_2\) 為對角線的矩形裡就可以了。
程式碼:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const double eps=1e-10; struct Point { double x,y; Point (double X,double Y) : x(X),y(Y) {} Point () {} void read() { scanf("%lf %lf",&x,&y); } Point operator - (const Point a) const { return Point(x-a.x,y-a.y); } double operator * (const Point a) const { return x*a.y-y*a.x; } }Q,P1,P2; int main() { Q.read(),P1.read(),P2.read(); double MinX=min(P1.x,P2.x),MaxX=max(P1.x,P2.x),MinY=min(P1.y,P2.y),MaxY=max(P1.y,P2.y); if(fabs((Q-P1)*(P2-P1))<eps&&Q.x+eps>=MinX&&Q.x<=MaxX+eps&&Q.y+eps>=MinY&&Q.y<=MaxY+eps) puts("YES"); else puts("NO"); return 0; }