我将使用两个函数来检查屏幕上对象之间的冲突,因为这些函数会被执行很多我希望确保它们以最高效率运行,并且因为它们目前似乎非常混乱我想知道我是否能得到你的帮助。
我的功能如下: 这是实际在对象上调用的函数:
bool ScreenObject::intersects(ScreenObject & a,ScreenObject & b) {
if(inter(a,b))
return true;
else
return inter(b,a);
}
这是inter:
bool inter(ScreenObject & a,ScreenObject & b) {
if(a->getsx()>b->getsx()) {
if(a->getsx()<b->getSxmax()) {
if(a->getsy()>b->getsy())) {
if(a->getsy<b->getSymax()) {
return true;
}
} else {
if(b->getsy()>a->getsy())) {
if(b->getsy<a->getSymax()) {
return true;
}
}
}
}
}
return false;
}
getsx / getsy返回x / y的最小值(即对象的左下角),而getSxmax / getSymax返回最大值。我的问题是,有没有办法让这些代码变得更好,因为目前这个代码看起来很糟糕。
答案 0 :(得分:1)
你是对的。这非常混乱。您想要跟踪每个对象的矩形范围:
typedef struct range { int min, max; } RANGE;
typedef struct bb { RANGE x, y; } BOUNDING_BOX;
关键操作是通过确定对象A必须位于B的任一侧来发现一维中存在 no 重叠。这是不相交的:
bool disjoint(RANGE *a, RANGE *b) { return b->max < a->min || b->min > a->max; }
现在我们可以使用它两次来发现2d中没有重叠:
bool disjoint(BOUNDING_BOX *a, BOUNDING_BOX *b) {
return disjoint(&a->x, &b->x) || disjoint(&a->y, &b->y);
}
当然,碰撞是不相交的逻辑补充,至少对于矩形物体而言。
对于其他形状,您仍然可以使用矩形范围来消除大部分碰撞测试的成本。如果范围是不相交的,则确定没有碰撞。如果不是不相交的话,那么你必须为一般多边形的碰撞做更昂贵的测试。有一些基本信息here。但是有几本关于这个主题的大书。
对于不喜欢C约定的@DanielKO,即使他们在这个问题上比OO更简洁地表达计算;也省略了构造函数和其他样板:
class Extent {
public:
bool isDisjointWithRespectTo(Extent &other) {
return max < other.min || other.min > max;
}
private:
int min, max;
}
class BoundingBox {
public:
bool isDisjointWithRespectTo(BoundingBox &other) {
return x.isDisjointWithRespectTo(other.x) || y.isDisjointWithRespectTo(other.y);
}
bool intersectsWith(BoundingBox &other) { return !isDisjointWithRespectTo(other); }
private:
Extent x, y;
}
构造函数需要确保在两个版本中正确排序min
和max
。