计算几何摸黑(2)-点和直线
来源:互联网 发布:怎么才能看到淘宝直播 编辑:程序博客网 时间:2024/05/22 00:31
相等判断函数
有的时候我们会用到判断一个数是否大于0,小于0或等于0。大于小于还好办,等于的话可能会出现例如0.00000000001≠0的现象,但是实际计算的时候这两个数是应该按照相等来算的。所以,我们可以自己定义一个函数dcmp(),来判断是否和0极其近似相等。
int dcmp(const double x){ const double eps = 1e-10; if (std::fabs(x) < eps) return 0; else return x < 0 ? -1 : 1;}
直线的参数表示
参数式:
这个式子的意思就是直线上的所有点的坐标都可以表示成
直线的交点
如果可以确保直线
实现如下:
// 这里是用了上述的t1的思路,用交点和P的交点距离求交点Point getLineInter(Point P, Vector v, Point Q, Vector w) // P + tv和Q + tw的……两点式……{ Vector u = P - Q; double t = mulCross(w, u) / mulCross(v, w); return P + v * t;}
点到直线的距离
点到直线的距离,很简单,就是叉乘乘出来的那个平行四边形的面积除以它的底。
double getDisPointToLine(Point p, Point a, Point b){ Vector v1 = b - a, v2 = p - a; return std::fabs(mulCross(v1, v2) / v1.getNorm()); // 如果不加std::fabs,得到的将是有向长度}
点到线段的距离
点到线段的距离一共有三种情况,设投影点为
对于①:所求的就是点
对于②:所求的就是向量
对于③:所求的就是向量
至于
double getDisPointToSeg(Point P, Point a, Point b){ if (a == b) return (P - a).getNorm(); Vector v1 = b - a, v2 = p - a, v3 = p - b; if (dcmp(mulDot(v1, v2)) < 0) return v2.getNorm(); else if (dcmp(mulDot(v1, v3)) > 0) return v3.getNorm(); else return std::fabs(mulCross(v1, v2) / v1.getNorm());}
点与线段的位置关系
一个点和一条线段无非就是两种关系,要么相交,要么相离。如果相交的话就相当于线段的两端点与该点所组成向量共线,且互相组成的两条向量方向相反。所以根据这两个性质,很容易想到需满足的性质为:点乘 < 0,且叉乘 == 0。为了避免精度错误,我这里用dcmp()来判断是否为0。
bool onSeg(Point P, Point hajimari, Point owari){ return dcmp( mulCross(hajimari - P, owari - P) ) == 0 && dcmp( mulDot(hajimari - P, owari - P ) ) < 0;}
线段相交判定
这里的线段相交,是指“规范相交”,即不算在端点处相交的情况。两线段相交的条件很好理解:每条线段的两个端点都在另一条线段的两侧。也就是说,一条线段两侧的端点所组成的向量分别和另一条线段自己构成的向量的叉乘符号相反。
bool isSegInter(Point a1, Point a2, Point b1, Point b2){ double c1 = mulCross(a2 - a1, b1 - a1), c2 = mulCross(a2 - a1, b2 - a1), c3 = mulCross(b2 - b1, a1 - b1), c4 = mulCross(b2 - b1, a2 - b1); return dcmp(c1) * dcmp(c2) < 0 && dcmp(c3) * dcmp(c4) < 0;}
点在直线上的投影
既然是点在直线上的投影,那么我们可以把直线
Point getLineProj(Point P, Point a, Point b){ Vector v = B - A; return A + v * (mulDot(v, P - a) / mulDot(v, v));}
- 计算几何摸黑(2)-点和直线
- 【计算几何】点和直线
- 计算几何摸黑(1)
- uva 11796 Dog Distance (计算几何-点和直线)
- 计算几何学习笔记之点和直线
- 计算几何点,直线,线段模板
- 计算几何摸黑(3)-圆及有关计算(上)
- HDU6164(计算几何--点关于直线的对称点)
- HDU 2857 Mirror and Light (计算几何求 对称点和两直线的交点)
- uva 11178 Morley's Theorem(计算几何-点和直线)
- POJ 1269 Intersecting Lines(计算几何 直线交点 点在直线上 直线平行)
- POJ 2318 TOYS 计算几何(点与直线关系)
- 计算几何 点对直线张开的夹角
- 计算几何模板一(点、线段、直线)
- 计算几何 判断点在直线的左右哪一侧
- 计算几何入门一:点,线段,直线,向量
- POJ 3304 Segments 【计算几何】【直线和线段的关系】
- POJ3304 Segments(计算几何,线段和直线的交点)
- LeetCode-445. Add Two Numbers II (JAVA)链表数字加法
- Lintcode31 Partition Array solution题解
- stl的二分函数
- 瑞神要考研(山东科技大学第四届ACM校赛)
- Robotframework--->SetUp的使用
- 计算几何摸黑(2)-点和直线
- 第六章 6-1 键盘消息
- 二叉树的中序遍历
- IMWeb训练营作业2
- Dialog的isShowing()方法一直返回为true
- Ubuntu 12.04下安装OpenCV 2.3.1,图像二值化
- 魔法宝石 spfa
- Android Activity四种启动模式
- 误差、欠拟合和过拟合