文章目录

  • 点与线
    • 直线的表达方式
    • 线段的表示
    • 点与直线的位置关系
    • 点与线段的位置关系
    • 点到直线的距离
    • 点在直线上的投影
    • 点关于直线的对称点
    • 点到线段的距离
    • 两直线位置关系
    • 求两直线(线段)交点
    • 判断两直线是否相交
  • 持续更新。。。。。。

点与线

直线的表达方式

直线表达形式有很多,我们重点讲一般式和斜截式

  • 一般式: ax + by + c = 0
  • 斜截式: y = kx +b

两点确定一条直线,所以我们将直线用两个点表示

struct Line
{Point p1, p2;Line() {}Line(Point p1, Point p2) :p1(p1), p2(p2) {}Line(Point p, double angle) //0<=angle<pi{p1 = p;if (sgn(angle - pi / 2) == 0){p2 = p1 + Point(0, 1);}else{p2 = (p1 + Point(1, tan(angle)));}}//ax+by+c=0Line(double a, double b, double c)     {if (sgn(a) == 0){p1 = Point(0, -c / b);p2 = Point(1, -c / b);}else if (sgn(b) == 0){p1 = Point(-c / a, 0);p2 = Point(-c / a, 1);}else{p1 = Point(0, -c / b);p2 = Point(1, (-c - a) / b);}}
};

线段的表示

typedef Line Segment;        //与直线扩展到向量类似

点与直线的位置关系

我们把点与直线的关系分为点在直线的左侧,右侧和在直线上

int Point_line_relation(Point p,Line v)
{int c=sgn(Cross(p-v.p1,v.p2-v.p1));  //计算叉积的正负从而加以判断if (c<0) return -1;        //p在v左侧if (c>0) return 1;        //p在v右侧return 0;                //p在v上
}

点与线段的位置关系

判断点P在直线v上,首先,用叉积判断是否共线,但这还不过,可能出现一下特殊情况

此时,就需要再加一条判断条件:P与v的两个端点夹角是否为钝角(180°)

bool Point_on_seg(Point p,Line v){return sgn(Cross(p-v.p1,v.p2-v.p1))==0&&sgn(Dot (p-v.p1,v.p2-v.p1))<=0;
}

点到直线的距离

可把点和线补成平行四边形,这所求距离即为平行四边形的高

double Dis_point_line(Point p,Line v){return Cross(p-v.p1,v.p2-v.p1)/distance(v.p1,v.p2);
}

点在直线上的投影

以下是证明过程:

double Point_line_proj(Point p,Line v){double k = Dot(v.p2-v.p1,p-v.p1)/Len2(v.p2-v.p1);//Len2为求p1p2长度的平方的函数(自定义),前面并未给出return v.p1+(v.p2-v.p1)*k;
}

点关于直线的对称点

我们先借助上面的函数球场投影,再求出对称点

Point Point_line_symmetry(){Point q = Point_line_proj(p.v);return Point(2*q.x-p.x,2*q.y-p.y);       //两点中点坐标公式变形
}

点到线段的距离

如果p1,p2在P两侧,则最短距离为点到线段的垂直距离

但如果p1,p2在P同侧,则不存在垂直距离

所以需先判断p1,p2是否在P同侧,再根据不同情况利用距离公式计算

Point Dis_point_seg(Point p,Segment v){if (sgn(Dot(v.p2-v.p1,p-v.p1))<0||sgn(Dot(p-v.p2,v.p1-v.p2))<0)return min(Distance(p.v1,p),Distance(p.v2,p));return Dis_point_line(p,v);
}

两直线位置关系

直线的位置关系分为重合,平行和相交

int Line_relation(Line v1,Line v2){if (sgn(Cross(v1.p2-v1.p1,v2.p2-v2.p1))==0){if (Point_line_relation(v1.p1,v2)==0) return 2;       //重合else return 0;                                      //平行}return 1;                                              //相交
}

求两直线(线段)交点

证明过程如下:
直接上代码

Point Cross_point(Point a,Point b,Point c,POint d){      //Line1:ab,Line2:cddouble s1=Cross(b-a,c-a);double s2=Cross(b-a,d-a);return Point(c.x*s2-d.x*s1,c.y*s2-d.y*s1)/(s2-s1);
}

注: 在只用此公式时应确保Line1和Line2相交,否则s2-s1=0造成除零运算

判断两直线是否相交

利用叉积的正负,如果相交,图中不同颜色模块的面积应该为相反数

bool Cross_segment(Point a, Point b, Point c, Point d) {//Line1:ab,Line2:cddouble c1 = Cross(c - a, b - a), c2 = Cross(d - a, b - a);double c3 = Cross(d - c, a - c), c4 = Cross(d - c, b - c);return sgn(c1) * sgn(c2) < 0 && sgn(c3) * sgn(c4) < 0;
}

以上代码还存在缺陷,如果出现下列情况将会判断错误


所以此时需要特判

持续更新。。。。。。

计算几何总结2————点与线相关推荐

  1. 计算几何问题汇总--点与线的位置关系

    点与点之间, 线与线之间,点与线之间的位置关系是一类非常重要的问题.它不仅是平面几何学的基石,也常常应用于LBS(Location Based Service),社交网络,以及数据库查询等领域. 本文 ...

  2. 【BZOJ】1610: [Usaco2008 Feb]Line连线游戏(几何)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1610 两种做法,一种计算几何,一种解析几何,但是计算几何的复杂度远远搞出解析集合(虽然精度最高) 计 ...

  3. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和

    一些基本的定义在这里: [模板] 计算几何1(基础): 点/向量/线/圆/多边形/其他运算 自适应Simpson Simpson's Rule: \[ \int ^b_a f(x)dx\approx ...

  4. [BZOJ1033][ZJOI2008]杀蚂蚁antbuster(大模拟)

    题目描述 传送门 题解 bz的题面真心不爽,建议去codevs 比较良心的一道大模拟,题面写的比较清楚,也没有什么坑 几个需要注意的地方 1.对于每一只蚂蚁来说,年龄=秒数-1 2.选择方向的过程是: ...

  5. 二维几何基础大合集!《计算几何全家桶(一)》(基础运算、点、线、多边形、圆、网格)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的模板整合计划 目录 1.基本运算 1.1 判断正负函数(sgn) 1.2 点积(数量积.内积)(Dot) 1.3 向量积 ...

  6. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  7. 从0开始的计算几何(一)———点与线

    前排提示,本文章内容来源于牛客进阶课程计算几何.(本人仅转述加总结,想要了解更多请点击牛客竞赛课程专栏购买) 本博客为菜鸡转述,如有错误请轻喷,大佬请点击右上角离开. 本文章较长,概念性知识较多,请各 ...

  8. 计算几何(二):线段与直线,点与线,线与线的关系

    写在前面 本文基于fxj巨佬的计算几何全家桶,并基于原文进行了自己的一些整理了经验补充,阅读本文前请前往支持巨佬fxj. 直线/线段的表示: 直线与线段的表示采用两点+方向向量的表示方法. 此外,一般 ...

  9. 点到直线的距离c语言程序,计算几何算法2. 关于线和点到线的距离(二维和三维)...

    关于直线 直线方程 点到直线的距离 用两点表示的直线 2d隐式表示的直线的情形 参数方程表示的直线 一个点到射线或线段的距离 代码实现 距离计算是计算机图形学和计算几何的基本问题,而且有很多关于这方面 ...

最新文章

  1. DCN-cs6200 ospf v2配置
  2. 宗成庆:如何撰写毕业论文?
  3. 嵌入式系统理解及相关知识100问
  4. 解决DataGridView在多线程中无法显示滚动条的问题
  5. 2018修复激活闪退_DNA损伤反应与DNA的修复(三)
  6. web -httpd
  7. asp.net mvc 重定向
  8. shell脚本操作mysql数据库,使用mysql的-e参数可以执行各种sql的(创建,删除,增,删,改、查)等各种操作
  9. log4j之log4j2.xml使用
  10. C# 利用反射动态创建对象[摘录]
  11. 全链路压测之全链自动化
  12. python动作捕捉_打破价格垄断,工程师自制动作捕捉系统-嵌入式系统-与非网
  13. 属性值第二个字符是大写引发的血案Warning:(X,X) java: Unmapped target property: “vCpu“.
  14. Win10 快捷键大全(史上最全)
  15. 【RNA-seq】表达矩阵的归一化处理(RPKM,TPM,FPKM,RPM(CPM))
  16. jira是干什么_JIRA是什么? | 学步园
  17. Effective java 读书笔记
  18. 标准盒模型和怪异盒模型的区别
  19. Python扫码登录保存和验证cookies值——微视篇(三)
  20. 共享充电宝为啥能够盈利

热门文章

  1. python中map用法详解_Python:map函数用法详解
  2. 高考改革后计算机老师,2018高考改革后,什么老师最紧缺?
  3. 创作工具抖音Android,抖音灵魂出窍特效制作bgm安卓版-抖音灵魂出窍特效制作软件v1.5.0 最新版-腾牛安卓网...
  4. 【摘】table滚动条样式
  5. 浅谈Arduino进入蓝牙模块的AT指令模式
  6. 触摸菜单:纸质菜单终结者
  7. iOS之字符串处理:截取字符串、匹配字符串、分隔字符串
  8. 软件问题引起的,内存不能为written的解决办法
  9. idea导入外部jar包不可用
  10. 【SSL_P2342】打击犯罪