【计算几何】点定位(线段,三角形,多边形)
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。
相关文章推荐
- 三维计算几何模板--表面三角形个数 表面多边形个数 三维凸包 表面积 凸包重心 点到面的距离
- 多线段几何图形—— 简单几何图形(多边形三角形化)
- 算法学习笔记之计算几何--三角形,多边形与圆
- !HDU 4380 三角屋内有奇数个宝藏的三角形有多少个-计算几何-(向量叉乘&线段与点的关系&暴力枚举)
- hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)
- CSU 1812 三角形和矩形(计算几何,多边形面积交)
- 计算几何 点到线段的距离 点在简单多边形内 点到凸多边形的距离
- poj 1584 计算几何 (点到线段距离+判断点是否在多边形内+判断多边形是否为凸包)
- POJ 3304 计算几何 直线与线段相交
- [从头学数学] 第275节 [计算几何] 多边形顶点的五种类型
- 计算几何学习笔记之多边形
- 计算几何-线段
- 【计算几何】点在多边形内部
- POJ 3304 Segments 【计算几何】【直线和线段的关系】
- 1605 计算几何:线段相交(快速排斥实验和跨立实验)
- 【计算几何】 POJ 1127 Jack Straws 判断线段是否相交
- 计算几何模板三(三角形常见)(不断更博)
- POJ 3304 Segments(计算几何:直线与线段相交)
- vtk实战(五十)—计算线段与多边形的交点