判断单位圆上的两段区间是否有交集

判断单位圆上的两段区间是否有交集

请大家关注我的微博:@NormanLin_BadPixel坏像素


最近在做小游戏的时候,遇到了这样一个问题。判断单位圆上的两段区间是否有交集,是用来模拟简单碰撞检测的。

比如我有一个物体,在圆上的区间是(ax,ay),有一个障碍物,在圆上的区间是(bx,by)。如果这两个区间相交,则这两个物体碰撞在一起。

在我的高中基友群发出这个问题后,以车牌号为奖励,大家踊跃发言,最终敲定了一种解决方案。当然我们可以通过分类来讨论这个问题,但是,我们希望以更少的分类讨论来解决这个问题。让代码看起来更加的优雅。

解决方案

首先,保证各个区间的长度大于0且小于1。且区间左边小于右边。

区间 a = (ax,ay)
ax < ay 
ay - ax < 1

举几个例子,区间可以是(0.1,0.5)、(-0.5,0.2)、(-5.7,-5.6);

上面出现负数,是因为圆是循环的。这也给两区间的判断添加了难度,如果不是循环的,则可以简单的用

max(ax,bx) < min(ay,by) 来判断是否相交。

接下来我们就来考虑循环区间的情况。我们用两个区间的来判断是否相交。

首先,把区间归一化。

区间 a(ax,ay),b(bx,by);

Normalize(a){
    temp = Math.floor(a.ay);
    a.ax -= temp;
    a.ay -= temp;
}
Normalize(a);
Normalize(b);

好像归一化后,就可以直接用max(ax,bx) < min(ay,by) 来判断是否相交了。。。。

然后,获取两个区间模的和。

l1 = (a.ay - a.ax) + (b.by - b.bx);

因为之前对区间的定义就是y > x,所以这里不用判断相减为负的情况。

获取一个新区间的模,这个区间包含了区间a和区间b。
这个新的区间不需要我们得出来,我们只要计算它的模就好。

l2 = a.ay - b.bx;
l3 = b.by - a.ax;
//因为l2,l3有可能大于或者小于1,这里需要对l2,l3归一化。
l3 -= Math.floor(l3);
l4 -= Math.floor(l4);
l3 = l3 < 0? l3 + 1 : l3;
l4 = l4 < 0 ? l4 + 1 : l4;
l4 = l2 > l3 ? l2 : l3;
l4 = l2 > l3 ? l2 : l3;

这个l4就是我们新区间的模了。

最后,我们只要判断l4 跟 l1 的长度就能知道区间a和区间b是否相交了。

return l4 <= l1;

画个图给大家理解。

image

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值