我环顾四周,但没有完全找到我要找的东西。起初,我认为这将是一个简单的问题。直到我尝试实现它并意识到有很多情况,我找不到通用的解决方案。
比如说,我有两个 AABB。如果他们的轮廓相交,我想得到他们所有的交点。最大点数为4 ,最小非零点数为1。
我的 AABB 由始终自动排序的 amin
和max
点组成,因此min
始终具有最低的xy 值并max
始终具有最高的xy 值。
下图显示了一些 AABB。蓝线表示它们的交点。请注意,如果 AABB 的一侧与另一侧重叠,则有点像沿着重叠的线段有无限数量的交点;在这些情况下,我想忽略它们并说,“那里没有交点”。
有人对算法有想法吗?我意识到我没有发布任何代码,我很确定这是不受欢迎的,但我已经考虑过这个问题了。至于我为什么要这样做……我不知道,我只是好奇是否可以干净地做到这一点。
哦,是的,我的 AABB 有这样的方法应该很有用:
Vector<2> getSize () const;
Point<2> getCenter () const;
//0=Quadrant-1, 1=Quadrant-2, 2=Quadrant-3, 3=Quadrant-4, else, error
Point<2> getCorner (int index) const;
//0=right, 1=up, 2=left, 3=down, else, error
LineSegment2D getSide (int index) const;
我可以做一个丑陋的黑客,只做线段<->线段检查,但是,我不知道'..感觉有点',嗯,丑陋和不雅。我很确定一定有一些技巧可以用min
和max
点来快速做到这一点。