Треугольная ограничивающая рамка

#c #bounding

#c #ограничение

Вопрос:

Я должен написать код, который вычисляет ограничивающую рамку треугольника. Координаты ограничивающей рамки должны быть записаны в

 triangle->bx, triangle->by, triangle->bw, triangle->bh
  

где

 bx, by is the upper left corner of the box
bw, bh is the width and height of the box
  

Должен ли я рассматривать свои точки как координаты или мне следует выбрать более основанное на геометрии решение?

Я попытался найти минимальное и максимальное значения для каждой координаты, но это не сработало. Любая помощь будет высоко оценена!

 if (triangle->sx1 <= triangle->sx2 <= triangle->sx3)
{
    triangle->bx = triangle->sx1;
}
else if (triangle->sx2 <= triangle->sx1 <= triangle->sx3)
{
    triangle->bx = triangle->sx2;
}
else (triangle->bx = triangle->sx3);

if (triangle->sy1 <= triangle->sy2 <= triangle->sy3)
{
    triangle->by = triangle->sy1;
}
else if (triangle->sy2 <= triangle->sy1 <= triangle->sy3)
{
    triangle->by = triangle->sy2;
}
else (triangle->by = triangle->sy3);

if (triangle->sx1 >= triangle->sx2 >= triangle->sx3)
{
    triangle->bw = triangle->sx1;
}
else if (triangle->sx2 >= triangle->sx1 >= triangle->sx3)
{
    triangle->bw = triangle->sx2;
}
else (triangle->bw = triangle->sx3);

if (triangle->sy1 >= triangle->sy2 >= triangle->sy3)
{
    triangle->bh = triangle->sy1;
}
else if (triangle->sy2 >= triangle->sy1 >= triangle->sy3)
{
    triangle->bh = triangle->sy2;
}
else (triangle->bh = triangle->sy3);
  

Комментарии:

1. Вы не можете сделать тройное сравнение таким образом, вы должны сравнивать их попарно.

2. ОК. Думаю, должен быть лучший способ сделать это, чем if-тестирование для каждого отдельного случая.

3. Вы должны выполнить if-test для каждого случая, но с использованием правильного синтаксиса языка.

4. В противном случае ваша идея поиска минимальных и максимальных значений — это правильный путь, просто сделайте сравнения правильно.

5. Треугольник имеет гораздо больше, чем одну ограничивающую рамку, если вы позволите рамке вращаться.

Ответ №1:

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

 int sx1 = triangle->sx1;
int sx2 = triangle->sx2;
int sx3 = triangle->sx3;
int sy1 = triangle->sy1;
int sy2 = triangle->sy2;
int sy3 = triangle->sy3;

int xmax = sx1 > sx2 ? (sx1 > sx3 ? sx1 : sx3) : (sx2 > sx3 ? sx2 : sx3);
int ymax = sy1 > sy2 ? (sy1 > sy3 ? sy1 : sy3) : (sy2 > sy3 ? sy2 : sy3);
int xmin = sx1 < sx2 ? (sx1 < sx3 ? sx1 : sx3) : (sx2 < sx3 ? sx2 : sx3);
int ymin = sy1 < sy2 ? (sy1 < sy3 ? sy1 : sy3) : (sy2 < sy3 ? sy2 : sy3);

triangle->bx = xmin;
triangle->by = ymax;
triangle->bw = xmax - xmin;
triangle->bh = ymax - ymin;
  

Ответ №2:

возможно, я опоздал с вопросом, но если у вас есть векторизация, вы можете сделать :

 vec3 v1;
vec3 v2;
vec3 v3;

aabb->min = min(v1,min(v2,v3));
aabb->max = max(v1,max(v2,v3));