2009-08-01 1 views
1

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

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

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

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

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

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

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

ответ

2

Все, что вы делаете, эффективно «использует уравнения линий», поэтому я не уверен, что делать с этим условием. Я предполагаю, что вы просто хотите, чтобы простые неравенства проверяли, в какой области находится случайная точка (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

Если вы не хотите проверять, является ли 'da-cb' положительным или отрицательным, тогда вы всегда можете сказать «if (dx-cy <0 && dx-cy 0 && dx-cy> da-cb) {правый столбец} else {средний столбец} 'и аналогичная вещь, чтобы определить, в какой строке она находится. Обратите внимание, что если' (a, b) 'не является" справа "из' (0,0) 'и' (c, d) 'не является «выше» '(0,0)', термины «верхний», «нижний», «левый», «правый» начинают смешиваться, потому что ваша доска tic-tac-toe перевернута и/или повернута. все еще говорят, что регионы обособлены просто отлично, но имена t его регионы больше не подходят. –

+0

Спасибо, это здорово. Что вы думаете о комментарии, поднимающем трапециевидные регионы? Как я уже сказал, я хочу сопоставить внешнюю точку с лучшими (я думаю, это самая близкая *) точка на краю фигуры. Из-за трапецоидов я не думаю, что этот подход с тик-таковым будет работать. Наверное, я проверяю, есть ли это трапеция, а затем какое-то другое поведение ... Лучший способ сделать это? Я думаю, что идея «ближайшей точки на линии» - это, вероятно, путь, поэтому я немного подумаю об этом. – cksubs

+1

Для нахождения ближайшей точки *, которая находится на краю фигуры, я не вижу, как вам помогает область области платы tic-tac-toe. Единственный метод, о котором я могу сейчас думать, - создать кандидата для каждого края формы (ближайшая точка на конкретном ребре - либо проекция точки на сегмент, либо одна из двух конечных точек), а затем проверьте, какой из четырех кандидатов ближе всего. Если вы действительно хотите, чтобы иметь возможность подумать об этой проблеме, я рекомендую узнать о точечных продуктах (http://en.wikipedia.org/wiki/Dot_product), особенно скалярную проекцию. –

4

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

+0

Хммм ... звучит сложно :) Я делаю это, чтобы облегчить выполнение некоторых условий, например, в исходном вопросе. Выполнение квадрата или прямоугольника было тривиальным, и мой код настроен таким образом, поэтому я предпочел бы что-то подобное. Я понимаю, как использовать уравнения линий для определения областей, но мне придется делать некоторые вычисления и т. Д., И это будет не так аккуратно, как если бы это был квадрат. Я собираюсь сделать это, если у кого-то нет лучшего совета. Так это то, что я могу вычислить просто/легко/аккуратно? Если нет, я, вероятно, просто поеду с линиями. Большое спасибо, хотя. – cksubs

+0

Не так сложно ... четвертая точка определяется другой 3, и на данный момент предположим, что одна точка равна (0,0). Остальные 2 точки (a, b) и (c, d). Таким образом, преобразование: (x, y) -> (D (bx-ay), D (cy-dx)) (где D = (1/(bc-ad)) Так что сравните эти значения с 0 и 1. Чтобы разрешить вместо (0,0) точку (p, q), просто вычислить: (x, y) -> (D (bx-ay) - p, D (cy-dx) - q –

+0

(При вычислении для (pq)! = (0,0) отрегулируйте a, b, c, d относительно p, q –

1

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

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

http://imgur.com/NaGwJ.png

(пожалуйста, простите мои навыки рисования ...)

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

+0

Хм, ты прав. Я имел в виду, что «линии не могут пересекаться», что вы не можете получить фигуру в форме песочных часов, но это усложняет ситуацию. Черт ... я должен знать, как правильно отобразить точку за пределами области до точки на краю области. С 9 tic-tac-toe-регионами это легко ... если он находится в одной из угловых областей, установите его в тот угол формы. В противном случае установите его на некоторую точку на краях формы.Но с этой новой информацией синяя точка может быть на левом, верхнем или центральном краю или в любом из верхних углов. Мне нужно подумать об этом лучше ... – cksubs

+0

@cksubs: обратите внимание также, что если вы выберете точку между двумя горизонтальными красными линиями, которая * направо * выключена вправо, то ближайшая точка на границе будет нижней правый угол, хотя точка не находится в нижней правой области. Эти регионы не делают то, что вы хотите. –

Смежные вопросы