【计算几何】点定位(线段,三角形,多边形)

判断是否点在线段上


1.满足向量 AC×AB == 0,使C点满足在AB的直线上


2.满足C在AB构成的矩形内,使C点排除在AB的延长线和反向延长线上
注意:考虑竖直和水平的情况,横坐标和纵坐标都要判断。

bool dot_line(point a,point b,point c)
{
    V v_line,v_dot;
    v_line.start = a;
    v_line.end = b;
    v_dot.start = a;
    v_dot.end = c;
    double temp = cross_mul(v_line,v_dot);
    if(fabs(temp) < esp && c.x >= min(a.x,b.x) && c.x <= max(a.x,b.x) && c.y >= min(a.y,b.y) && c.y <= max(a.y,b.y))
        return true;
    return false;
}

判断点在三角形内外

点在平面内与三角形三个点构成的三个三角形的面积和 与 原三角形的面积比较

如果相等,即可判断在三角形内

struct triangle
{
    point a,b,c;
};

bool dot_triangle(point x,triangle f)
{
    V ax,bx,cx,ab,ac;
    ax.start = f.a;
    ax.end = x;
    bx.start = f.b;
    bx.end = x;
    cx.start = f.c;
    cx.end = x;
    ab.start = f.a;
    ab.end = f.b;
    ac.start = f.a;
    ac.end = f.c;
    double abx = fabs(cross_mul(ax,bx));
    double acx = fabs(cross_mul(ax,cx));
    double bcx = fabs(cross_mul(bx,cx));
    double abc = fabs(cross_mul(ab,ac));
    if(fabs(abx+acx+bcx - abc) < esp)
        return true;
    return false;
}


判断点在多边形内外

1. 扫描线法

顾名思义,从要判断的点构造任意射线,计算射线与多边形的交点个数,一般情况下,个数为奇数则在多边形里面,反之在外面。

既然写一般情况,那么就有特殊情况。

除了要注意,在用多边形的边和射线相交来算交点,如果交于顶点处,射线与两个边相交,但只能算一个点

也有可能射线与边重合,还有可能点在多边形边上,

另外最麻烦的是如下图情况,只能算一个点,然而书上的解决方法(如果顶点是所属边上纵坐标上较大的顶点)我不大认同,我想下图反一下不就行不通了吗,可能是我没懂。。。


2. 叉乘判别法(只适用凸多边形)

原理比较简单,对于一个处于凸多边形内部的点,与所有顶点连接,生成以此点开始的向量,根据顶点的顺序运算相邻向量的叉积,叉积的符号一直不变。

特殊情况:叉积为0,其实继续判断即可。


3. 角度和的判断法

原理更简单,在多边形内部,点和多边形顶点连接组成的所有三角形角度(以所求点为顶点)和为360。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值