首页 > 其他 > 详细

[学习笔记]计算几何

时间:2018-11-24 23:11:37      阅读:240      评论:0      收藏:0      [点我收藏+]

堪称明明看得见,就是写不出的一类恶心题。

通常细节颇多。

一旦方法选择合适,代码量和效率都会提升不少。

 

推荐:

「计算几何」计算几何从入门到入土

(以下图片均来自此博客)

 

技术分享图片
struct po{
    double x,y;
    po(){}
    po(double xx,double yy){
        x=xx;y=yy;
    }
    po friend operator +(po a,po b){
        return po(a.x+b.x,a.y+b.y);
    }
    po friend operator -(po a,po b){
        return po(a.x-b.x,a.y-b.y);
    }
};

(加减为了向量方便赋值)

 

两(多)点距离公式

技术分享图片
double dis(po a,po b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
距离公式

 

中点

(x=(x1+x2)/2,y=(y1+y2)/2)

向量

技术分享图片
struct vec{
    double x,y;
    vec(){}
    vec(po a){
        x=a.x,y=a.y;
    }
    double len(){
        return sqrt(x*x+y*y);
    }
};
向量

向量加减和数乘略了。

len是向量的模长。

点积

技术分享图片
double dot(vec a,vec b){
    return a.x*b.x+a.y*b.y;
}
点积

 

点积用处:可以通过两个向量的点积正负,判断向量夹角是锐角、直角、钝角

叉积

技术分享图片
double cross(vec a,vec b){
    return a.x*b.y-a.y*b.x;
}
叉积

 

意义,两个向量构成的平行四边形的有向面积

AxB ,如果有A在B的逆时针方向(不超180度),那么面积是负的。否则是正的。

 

向量旋转

https://zhidao.baidu.com/question/562549647.html

 

常用方法

精度控制

设置eps 1e-7~1e-10

技术分享图片
int Fabs(double t){
    if(fabs(t)<eps) return 0;
    if(t>0) return 1;
    return -1;
}
Fabs

 

 

点到直线距离(给出三个点)

叉积算平行四边形面积,然后除以底的长度,得到高(距离)

技术分享图片
double hei(po p,po a,po b){
    vec t1=vec(a-b),t2=vec(p-b);
    return fabs(cross(t1,t2))/dis(a,b);
}
点到直线距离

 

 

点到线段距离

点积判断和端点形成的角是否是钝角。是钝角,就只能是和线段两个端点的距离取min

技术分享图片

 

 

线段是否相交

 跨立实验

如果两个线段端点互相都在对方的两侧,那么相交。

 

点在多边形内部

 

求任意多边形面积

 

多边形重心

 

 

凸包

 

Graham 算法

 

旋转卡壳

 

 

例题:

 

[学习笔记]计算几何

原文:https://www.cnblogs.com/Miracevin/p/10013826.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!