计算几何类------分离轴定理

这是一般用于检测凸多边形是否重叠的理论,并简称为SAT

首先 我们先看一下知乎上对于分离轴定理的定义:

我们定义分离轴是这样一个方向轴,两个convex物体分别投影到这个轴上,同时这两个物体的投影互不相交。因此,若给出两个convex物体A、B,若存在一条分离轴则这两个物体AB必不相交,否则这两个物体存在相交。

也就是说我们可以通过判断投影是否存在间隙来判断物体是否相碰撞。

第一部分,对于不规则图形,若是可以简化成外围为简单的几何凸多边形,我们就可以用此来判断

下面记录我写的一道例题

给出两个矩形的四个位置坐标,试求是否碰撞,题保证若碰撞,两矩形的重叠面积至少占其中的一个矩形面积的10%

下面给出我copy加自己简化的代码(第一次写不会)

typedef struct {
    float x,y;
}point;
point rt1[4],rt2[4];
float axis(point p,point o,point v_axis){
    point p_o;
    p_o.x=p.x-o.x;
    p_o.y=p.y-o.y;
    return p_o.x*v_axis.x+p_o.y*v_axis.y;
}
int check(point v_axis,point o){
    float al=FLT_MAX,ar=-FLT_MAX,bl=FLT_MAX,br=-FLT_MAX;
    for(int i=0;i<4;i++){
        al=min(al,axis(rt1[i],o,v_axis));
        ar=max(ar,axis(rt1[i],o,v_axis));
        bl=min(bl,axis(rt2[i],o,v_axis));
        br=max(br,axis(rt2[i],o,v_axis));
    }
    if(ar<=bl)return 0;
    if(al>=br)return 0;
       return 1;
}
int solve(){
    point v_rt1_h,v_rt1_w,v_rt2_h,v_rt2_w;
    v_rt1_h.x=rt1[3].x-rt1[0].x;
    v_rt1_h.y=rt1[3].y-rt1[0].y;
    v_rt1_w.x=rt1[1].x-rt1[0].x;
    v_rt1_w.y=rt1[1].y-rt1[0].y;
    v_rt2_h.x=rt2[3].x-rt2[0].x;
    v_rt2_h.y=rt2[3].y-rt2[0].y;
    v_rt2_w.x=rt2[1].x-rt2[0].x;
    v_rt2_w.y=rt2[1].y-rt2[0].y;
    int ans=1;
    ans&=check(v_rt1_h,rt1[0]);
    ans&=check(v_rt1_w,rt1[0]);
    ans&=check(v_rt2_h,rt2[0]);
    ans&=check(v_rt2_w,rt2[0]);
    return ans;
}

 首先我们可以从中得到一点经典的惯用技巧:

1,可以定义一个结构体来简化点的输入

2,可以定义多个结构体数组来描绘一个对象

3,需要包含<float.h>头文件来定义极大极小值

其次

我们开始分析函数

第一个是投影位置的长度

假设以o点为坐标原点,那么以o点链接的一条边为投影的x轴,得到v_axis,

输入一个坐标,那么其投影的长度公式为x1*x2+y1*y2;

可得到有向线段的长度

第二个是逐个坐标带入,求取对应矩形的投影长度最大最小值。

然后返回是否存在不相交的情况

若是遍历矩形的所有的边,仍未找到,返回1(碰撞)。

另外

我们一般处理空间上的点时,利用向量可以减少不必要的排序。

后记

只是学了这个定理,感觉其道理简朴,思绪明了,但纸上得来终觉浅,需要更深入的结合实践来巩固才好,同时此题也让我大开眼界,计算几何道阻且长。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《解析几何简明教程-吴光磊pdf》是一本非常实用的解析几何教程,总共有300页。这本教程以简明扼要的方式,将解析几何的基础知识进行了系统地讲解,适合初学者阅读。 首先,这本教程通过具体的例题,详细地介绍了解析几何的基本概念和基本定理。它从直线、平面和空间的方程、距离和角度开始,逐步引导读者理解解析几何的基本元素和性质。同时,教程还介绍了直线与平面的交点、平面与平面的位置关系等内容,为读者提供了解析几何的基本工具和方法。 其次,这本教程注重对解析几何思维方式的培养。通过一些典型问题的讲解与求解过程,教程引导读者学会运用解析几何的方法进行问题分析和解决。此外,教程还提供了大量的习题和答案,供读者进行巩固和拓展训练,帮助读者更好地掌握解析几何的知识和技巧。 最后,这本教程还包括了解析几何在实际问题中的应用。通过一些具体的例子,教程向读者展示了解析几何几何图形的分析、空间位置的确定等方面的实际应用。这不仅使得学习解析几何变得更加有趣,也增强了读者对解析几何在实际中的应用信心和兴趣。 总之,《解析几何简明教程-吴光磊pdf》是一本内容丰富、条理清晰的解析几何教材,适合初学者阅读和使用。它能够帮助读者建立起解析几何的基础知识,提高解析几何的解题能力,并培养解析几何思维方式。无论是对于高中生还是对于需要应用解析几何的人群来说,这本教程都是一本不可多得的学习资料。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值