Как определить, находится ли точка в четырехстороннем

Цель

Я хочу определить, находится ли контрольная точка в пределах определенного четырехугольника. Я, вероятно, собираюсь реализовать решение в Matlab, поэтому мне нужен только псевдокод.

Входы

Уголки четырехугольника: (x1, y1) (x2, y2) (x3, y3) (x4, y4)

Контрольная точка: (xt, yt)

Выход

1 - Если внутри четырехугольника

0 - В противном случае

Обновление

Было указано, что идентификации вершин четырехугольника недостаточно, чтобы однозначно идентифицировать его. Вы можете предположить, что порядок точек определяет стороны четырехугольника (точка 1 соединяет 2, 2 соединяется с 3, 3 соединяется с 4, 4 соединяется с 1)

Ответ 1

Используйте inpolygon. Использование будет inpolygon(xt,yt,[x1 x2 x3 x4],[y1 y2 y3 y4])

Ответ 2

enter image description here

Вы можете проверить Точку с этим условием. Также вы можете рассматривать четырехугольник как два треугольника для вычисления его площади.

Ответ 3

Так как это простой четырехугольник, вы можете проверить точку в треугольнике для каждого конца и точку в прямоугольнике для середины.

EDIT Вот некоторый псевдокод для треугольника:

function SameSide(p1,p2, a,b)
    cp1 = CrossProduct(b-a, p1-a)
    cp2 = CrossProduct(b-a, p2-a)
    if DotProduct(cp1, cp2) >= 0 then return true
    else return false

function PointInTriangle(p, a,b,c)
    if SameSide(p,a, b,c) and SameSide(p,b, a,c)
        and SameSide(p,c, a,b) then return true
    else return false

Или используя метод Barycentric:

A, B и C - конечные точки треугольника, P - проверяемая точка

// Compute vectors        
v0 = C - A
v1 = B - A
v2 = P - A

// Compute dot products
dot00 = dot(v0, v0)
dot01 = dot(v0, v1)
dot02 = dot(v0, v2)
dot11 = dot(v1, v1)
dot12 = dot(v1, v2)

// Compute barycentric coordinates
invDenom = 1 / (dot00 * dot11 - dot01 * dot01)
u = (dot11 * dot02 - dot01 * dot12) * invDenom
v = (dot00 * dot12 - dot01 * dot02) * invDenom

// Check if point is in triangle
return (u > 0) && (v > 0) && (u + v < 1)

Ответ 4

Если цель состоит в том, чтобы закодировать свой собственный тест, выберите любой классический точка в полигоне для реализации. В противном случае сделайте то, что предлагает Иаков.

Ответ 5

предполагая, что данные координаты расположены s.t. (x1, y1) = самая правая координата (x2, y2) = самая верхняя координата (x3, y3) = крайняя левая координата (x4, y4) = наибольшая координата botoom

Вы можете сделать следующее:

1. calculate the 4 lines of the quadrilateral (we'll call these quad lines)
2. calculate 4 lines, from the (xt, yt) to every other coordinate (we'll call these new lines)
3. if any new line intersects any of the quad lines, then the coordinate is outside of the quadrilateral, otherwise it is inside.