Определение, лежит ли точка на прямой, на луче или на отрезке
x0, y0 = map(int, input().split())
x1, y1 = map(int, input().split())
x2, y2 = map(int, input().split())
# прямая
q = (x0 - x1) * (y2 - y1) - (y0 - y1) * (x2 - x1)
if q == 0:
print("YES")
else:
print("NO")
# луч
q1 = (x0 - x1) * (y2 - y1) == (x2 - x1) * (y0 - y1)
q2 = (x0 - x1) * (x2 - x1) >= 0
q3 = (y0 - y1) * (y2 - y1) >= 0
if q1 and q2 and q3:
print("YES")
else:
print("NO")
# отрезок
q1 = (x0 - x1) * (y2 - y1) - (x2 - x1) * (y0 - y1) == 0
q2 = 0 <= (x0 - x1) * (x2 - x0) <= (x1 - x2)**2
q3 = 0 <= (y0 - y1) * (y2 - y0) <= (y1 - y2)**2
if q1 and q2 and q3:
print("YES")
else:
print("NO")
#include <bits/stdc++.h>
using namespace std;
int main() {
int x0, y0, x1, y1, x2, y2;
cin >> x0 >> y0 >> x1 >> y1 >> x2 >> y2;
// прямая
int q = (x0 - x1) * (y2 - y1) - (y0 - y1) * (x2 - x1);
cout << (q == 0 ? "YES" : "NO") << endl;
// луч
bool q1 = (x0 - x1) * (y2 - y1) == (x2 - x1) * (y0 - y1);
bool q2 = (x0 - x1) * (x2 - x1) >= 0;
bool q3 = (y0 - y1) * (y2 - y1) >= 0;
cout << (q1 && q2 && q3 ? "YES" : "NO") << endl;
// отрезок
bool q1s = (x0 - x1) * (y2 - y1) - (x2 - x1) * (y0 - y1) == 0;
bool q2s = (x0 - x1) * (x2 - x0) >= 0 && (x0 - x1) * (x2 - x0) <= (x1 - x2)*(x1 - x2);
bool q3s = (y0 - y1) * (y2 - y0) >= 0 && (y0 - y1) * (y2 - y0) <= (y1 - y2)*(y1 - y2);
cout << (q1s && q2s && q3s ? "YES" : "NO") << endl;
return 0;
}
Точка лежит на прямой AB, если векторное произведение векторов AB и AC равно нулю:
Точка лежит на луче AB, если:
Точка лежит на отрезке AB, если:
Ввод: x₀ y₀ — точка C, x₁ y₁ — точка A, x₂ y₂ — точка B
Вывод: три строки: для прямой, луча и отрезка (YES/NO)
2 2
0 0
4 4
Точка (2,2) лежит на прямой через (0,0) и (4,4), на луче и на отрезке → YES YES YES