← Назад к геометрии

Принадлежность точки прямой, лучу, отрезку

Определение, лежит ли точка на прямой, на луче или на отрезке

🐍 Python
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")
⚙️ C++
#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 равно нулю:

(x₀ - x₁)·(y₂ - y₁) - (y₀ - y₁)·(x₂ - x₁) = 0

Луч

Точка лежит на луче 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

Попробовать онлайн

Результат появится здесь...