您的位置:首页 > 其它

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

2017-02-25 12:32 381 查看

判断是否点在线段上



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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: