【问题标题】:Triangle bounding box三角形边界框
【发布时间】:2017-02-19 19:33:02
【问题描述】:

我应该编写代码来计算三角形的边界框。 边界框坐标应写入

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);

【问题讨论】:

  • 你不能这样进行三重比较,你必须成对比较。
  • 好的。猜猜必须有比对每个案例都进行 if 测试更好的方法。
  • 您必须对每种情况进行 if 测试,但要使用正确的语言语法。
  • 否则你的想法是找到最小值和最大值是要走的路,只需正确进行比较即可。
  • 一旦您允许框旋转,三角形就会有不止一个边界框。

标签: c bounding


【解决方案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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多