计算几何常用公式与技巧归纳之系列一:点与线

double eps=1e-8;
struct P
{
    double x,y;
    P(){}
    P(double x,double y):x(x),y(y){}
    P operator -(const P& p){return P(x-p.x,y-p.y);}
    P operator +(const P& p){return P(x+p.x,y+p.y);}
    P operator *(double d){return P(x*d,y*d);}
    P operator /(double d){return P(x/d,y/d);}
    double operator *(const P& p){return x*p.y-y*p.x;}// 叉积
    double operator &(const P& p){return x*p.x+y*p.y;}// 点积
    P rot(double th){return P(x*cos(th)-y*sin(th),x*sin(th)+y*cos(th));}// 逆时针旋转
    double dis(){return sqrt(x*x+y*y);}// 与原点的距离
    double angle(){return atan2(y,x);}// 极角
    void read(){scanf("%lf%lf",&x,&y);}
};
struct Line
{
    P a,b;// 当表示有向时,将a作为起始点
    Line(){}
    Line(P a,P b):a(a),b(b){}
    void read(){a.read();b.read();}
    double dis(){  return (a-b).dis(); }
}L;
ps:上面重载了点的相关操作,会在下面的代码中遇到。

首先介绍下叉积与点积:

叉积(*): a*b=|a|*|b|*sin(th)(注意:th为向量a绕原点旋转到b的角度,逆时针方向为正)

性质: 我们可以用叉积来判断点在向量的哪一边

性质二:用来求三角形的面积

性质三: asina*b / (|a|*|b|) )可以得到a,b之间的夹角,但是一定要注意asin()的返回范围是:[-pi/2, pi/2], 因此如果两者之间成钝角,会出现问题,因而可以用来求锐角的角度

点积(&):a&b=|a|*|b|*cos(th),

性质一:基于cos(th)在90°~180°为负,可以判向量之间是否为钝角

性质二:向量之间的度数,这里就保证了范围为0°~180°





《明天继续更新》








点在直线上

点在线段上

点到直线的距离

点到直线的垂足

点到线段的最近距离

点关于直线的对称点

两直线的交点






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值