Нахождение какой области содержит точку на основе координат - PullRequest
1 голос
/ 01 августа 2009

У меня есть 4 точки, которые образуют некоторый четырехугольник. Линии не могут пересекаться или что-то в этом роде, это должны быть квадрат, прямоугольник, ромб, параллелограмм и т. Д.

Линии, которые их соединяют, разбивают поле на 9 областей. С квадратом это будет выглядеть как крестики-нолики (#), но с другими формами линии будут под углами.

Точка случайно попадает в это поле из 9 областей. Я знаю координаты случайной точки, а также координаты четырехугольников четырехугольника.

Можно ли как-нибудь найти, какое поле содержит точку , не используя уравнения линий ?

Я в основном ищу что-то вроде

if(p.x > q1.x && p.x < q4.x && p.y < q3.y) {
    //It's in the top left region
}
etc

Я думаю, что это невозможно при использовании наклонных линий (вместо квадрата / прямоугольника) без решения линейных уравнений. Но я подумал, что сначала заведу его ребятам по математике. СПАСИБО!

Ответы [ 3 ]

5 голосов
/ 01 августа 2009

Это может быть эквивалентно «использованию уравнений линий», но очевидная вещь, которую нужно сделать, - это вычислить аффинное преобразование, которое переводит ваши четыре точки в единичный квадрат (0,0), (0,1), (1,0), (1,1). Чтобы определить местоположение точки, примените преобразование к точке и сравните результат с единичным квадратом.

3 голосов
/ 01 августа 2009

Все, что вы делаете, эффективно «использует уравнения линий», поэтому я не уверен, что делать с этим условием. Я предполагаю, что вы просто хотите, чтобы простые неравенства проверяли, в какой области находится случайная точка (x,y), поэтому я покажу вам, как это сделать.

Исходя из вашего вопроса, звучит так, будто у вас всегда есть параллелограмм, поэтому давайте предположим, что это (0,0), (a,b), (c,d) и (a+c,b+d), что немного облегчает понимание. Чтобы исправить свою ментальную картину, представьте, что (a,b) примерно "справа" от (0,0), а (c,d) примерно "выше" (0,0). Тогда уравнениями для «горизонтальных» линий будут -bx+ay=0 и -bx+ay=-bc+ad, так что вы получите три варианта, в зависимости от того, как -bx+cy сравнивается с 0 и -bc+ad:

// Assuming -bc+ad is positive
-bx+ay < 0           // it's in the "bottom row"
0 < -bx+ay < -bc+ad // it's in the "middle row"
-bc+ad < -bx+ay     // it's in the "top row"

Аналогично, уравнения для «вертикальных» линий - это dx-cy=0 и dx-cy=da-bc, поэтому три возможности, в зависимости от того, как dx-cy сравнивается с 0 и da-cb:

// Still assuming ad-bc is positive
dx-cy < 0           // it's in the "left column"
0 < dx-cy < da-cb  // it's in the "middle column"
da-cb < dx-cy      // it's in the "right column"

Конечно, если da-cb отрицательно, то три варианта в каждом случае "меньше чем da-cb", "между da-cb и 0" и "больше чем 0" вместо этого. Наконец, если равенство когда-либо выполнено, то точка (x,y) на самом деле на одной из линий, а не в одной из областей.

1 голос
/ 01 августа 2009

Линии, которые их соединяют, разбивают поле на 9 областей. С квадратом это будет выглядеть как крестики-нолики (#), но с другими формами линии будут под углами.

Что если ваши очки составляют трапецию (или трапецию)?

Например, если точки (-2, 0), (2, 0), (-1, 1), (1, 1), то «линии ... под углами» будут пересекаться, и это неясно, в каком из «9 регионов» вы хотели бы, скажем, (0, 10) быть в:

http://imgur.com/NaGwJ.png

(прошу прощения за мои навыки рисования ...)

Если, конечно, «линиями не могут пересекаться или что-то в этом роде», вы имеете в виду, что четырехугольник всегда является параллелограммом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...