Самый быстрый способ преобразования четырехугольника в треугольную полосу?

Каков самый быстрый способ преобразования четырехугольника (состоящего из четырех точек x,y) в полосу треугольника? Я хорошо знаком с существующими общими алгоритмами триангуляции, но мне нужен короткий, хорошо оптимизированный алгоритм, работающий только с четырехугольниками.

Мой текущий алгоритм делает это, и он работает для большинства квадроциклов, но для некоторых все еще путает точки:

#define fp(f) bounds.p##f

/* Sort four points in ascending order by their Y values */
point_sort4_y(&fp(1), &fp(2), &fp(3), &fp(4));

/* Bottom two */
if (fminf(-fp(1).x, -fp(2).x) == -fp(2).x)
{
    out_quad.p1 = fp(2);
    out_quad.p2 = fp(1);
}
else
{
    out_quad.p1 = fp(1);
    out_quad.p2 = fp(2);
}

/* Top two */
if (fminf(-fp(3).x, -fp(4).x) == -fp(3).x)
{
    out_quad.p3 = fp(3);
    out_quad.p4 = fp(4);
}
else
{
    out_quad.p3 = fp(4);
    out_quad.p4 = fp(3);
}

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


person Kristina Brooks    schedule 02.09.2012    source источник
comment
Вы спрашиваете об одном квадроцикле? Или сетка из квадов? Какая ситуация не работает для вас в данный момент? И если это так, то почему вы все равно превращаете один четырехугольник в треугольную полосу?   -  person Bart    schedule 03.09.2012
comment
Кажется, что вы не знаете, в каком порядке расположены точки, поскольку создать полосу легко, если вы знаете порядок. да?   -  person phkahler    schedule 04.09.2012


Ответы (2)


Учитывая четырехугольник A B C D, мы можем разделить его на A B C, A C D или A B D, D B C.

Сравните длину A-C и B-D и используйте более короткую для разделяющей кромки. Другими словами, используйте A B C, A C D, если A-C короче, и A B D, D B C в противном случае.

person Dude    schedule 03.09.2012
comment
К сожалению, это не работает для вогнутых четырехугольников (да, я знаю, что это не настоящий четырехугольник). например, A=0,0 B=5,0 C=4,1 D=5,2, затем AC=SQR(17) BD=SQR(4), но на самом деле вам нужно разделить на более длинном ребре AC, иначе DBC лежит снаружи квадроцикл. Просто упоминание об этом для читателей, у которых возникнет соблазн использовать это для любых квадроциклов. - person Roger Attrill; 10.05.2013
comment
Пожалуйста, используйте алгоритм, набросанный в моем ответе. Работает для простых выпуклых и вогнутых четырехугольников с постоянной временной сложностью, и нет необходимости что-либо умножать или извлекать квадратный корень. Только простые сравнения. - person Paul Michalik; 07.08.2016

  1. Найдите точку экстремума четырехугольника относительно координаты. Пусть это будет p, где p — итератор циклического контейнера.
  2. Проверьте, лежит ли p + 2 внутри уха, образованного {p - 1, p, p + 1}. Если да, ищем экстремум относительно другую координату (или переключиться с min на max или наоборот) и повторить шаг 1.
  3. Разобьём четырёхугольник на два треугольника, отрезав «ухо» вокруг точки экстремума: t0 = { p - 1, p, p + 1} и t1 = { p + 1, p + 2, p - 1 }

Не нужно сортировать, просто найдите экстремум. Если ваши четырехугольники гарантированно выпуклы (действительные четырехугольники), то пропустите поиск экстремума и выберите произвольное p.

Изменить: изменено в соответствии с предложением из комментария. Также формулировку, предложенную комментатором, проще реализовать:

  1. Дан четырехугольник A, B, C, D, образующий диагонали AC и BD.
  2. Если точки B и D лежат по разные стороны от AC, то AC можно использовать для разделения четырехугольника
  3. Примените те же рассуждения к BD и точкам A и C.
person Paul Michalik    schedule 03.09.2012
comment
Точка экстремума относительно размерность – это вершина четырехугольника с максимальным или минимальным значением соответствующей координаты. Гарантируется, что оно выпуклое. - person Paul Michalik; 07.08.2016
comment
Вы имеете в виду вершину, которая лежит на ограничивающей рамке? - person Adi Shavit; 07.08.2016
comment
Нет вершины четырехугольника. Это работает для любого простого многоугольника. - person Paul Michalik; 09.08.2016
comment
Я, возможно, был неясен. Вы имеете в виду найти вершину четырехугольника, которая лежит на одной из граней ограничивающего прямоугольника четырехугольника (что делает хотя бы одну из ее координат экстремумом)? Если нет, то я до сих пор не понимаю, что вы подразумеваете под вершиной четырехугольника с максимальным или минимальным значением соответствующей координаты. Кроме того, будет ли это работать и с неплоским четырехугольником? - person Adi Shavit; 09.08.2016
comment
Я не думаю, что это правильно, так как крайняя точка не обязательно является ухом. Например. в 2D я могу вращать наконечник стрелы, т.е. вогнутый четырехугольник, с.т. кончик стрелки находится в экстремуме, но тогда шаг 2 не даст правильного разбиения. Более консервативный способ — сначала выбрать диагональ, а затем проверить, находятся ли две другие вершины на одной стороне линии, поддерживающей диагональ. - person danielyan86129; 26.10.2018
comment
Ты прав! Вам нужно проверить, лежит ли четвертая вершина p + 2 внутри уха. - person Paul Michalik; 27.10.2018
comment
...Тогда диагональный тест является более элегантной формулировкой метода. - person Paul Michalik; 27.10.2018