- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2课 叉积的应用
判断点是否凸多边形上 面积法需要计算n-2+n次叉积 最后判断1次 旋向法最多计算n次叉积,最少计算2次叉积,因此计算次数少 但是旋向法需要大量的判断 由于判断比计算效率更高,所以当n越大,旋向法就要越好 另一方面,两种方法的时间复杂度都是O(n) 为什么不能判断点是否在凹多边形上 面积法和旋向法本质上是等价的,都只能用于判断点是否在凸多边形上,不能判断是否在凹多边形上 习题 11321,点到线段的距离 POJ1654,多边形面积 POJ2318,点在凸多边形内 10760,点到线段的距离 OVER 第2课 叉积的应用 ACM-计算几何 罗迅 目录 回顾 点的数据结构 叉积的计算原理 叉积的计算代码 叉积的几何意义 叉积的更多应用 求多边形的面积 判断点是否在直线上 判断点是否在线段上 判断点是否在三角形上 判断点是否在凸多边形上 习题 点的数据结构 struct point_t{ int x; int y; }; struct point64f_t{ double x; double y; }; 向量叉积的运算原理 假设有两个向量a1(x1,y1)、a2(x2,y2) 向量的外积也称作叉积:a1×a2 = x1y2 – x2y1 叉积运算可以使用行列式完成 叉积的计算代码 //向量的叉积,表示OA×OB int cross(point_t constO,point_t const A,point_t const B){ int xoa = A.x – O.x; int yoa = A.y – O.y; int xob = B.x – O.x; int yob = B.y – O.y; return xoa * yob - yoa * xob; } 叉积的几何意义 叉积的正负遵守右手螺旋定则 叉积的数值跟向量的长度以及夹角的正弦有关 叉积更多的几何应用 求多边形的面积 判断点是否在直线上 判断点是否在线段上 判断点是否在三角形上 判断点是否在凸多边形上 绝大部分凸多边形题目都可以使用外积解决。但非凸多边形则不行!! 多边形的表示方法 一般用点的数组point_t P[N]表示N边形 从P[0]到P[N-1]依次表示顺时针或者逆时针的顶点顺序 很显然,同一个多边形的表示方法不是唯一的,不过通常我们不关心这个 求多边形的有向面积 double area(point_t const P[],int n){ int ret = 0; for(int i=1;iN-1;++i) ret += cross(P[0],P[i],P[i+1]); return ret/2.0; } 有向面积有正有负,例如:右上图有向面积是正的,右下则是负的 有向面积还可用于判断顶点是顺时针顺序还是逆时针顺序 有向面积可以用于凹多边形 求凹多边形的有向面积 凹多边形的有向面积同样能够说明点集的旋转顺序 例如左图有向面积为正,因此是逆时针序;值得注意的是点1、2、3的旋向确实顺时针的;这也恰好是该图形为凹多边形的原因 求多边形的有向面积 实际上,我们可以任选一点作为固定点,来计算多边形的有向面积,而不必非得选择多边形的端点 对凹多边形有同样的结论 因此有向面积是一个非常重要的性质,少有的凸多边形和凹多边形一致的性质 求多边形的面积(绝对面积) 求有向面积 取绝对值 判断点是否在直线上 直线方程以后再讲 一般而言,题目不会直接给出直线方程,而会给出两点,由两点确定一条直线 给定直线AB,以及一点P,问P是否在直线上 bool isOn(point_t constP,point_t constA,point_t constB){ return 0 == cross(P,A,B); } 线段的数据结构 struct lineseg_t{ point_t s; point_t e; } 线段由2个不同的端点确定 一般而言,题目保证2个端点不相同,省去了很多边界条件的判断 另外,一般不确定端点的顺序,所以线段的表示方法也不是唯一的 bool isOn(point_t const P, lineseg_t const ls){ return min(ls.s.x,ls.e.x) = P.x P.x = max(ls.s.x,ls.e.x) min(ls.s.y,ls.e.y) = P.y P.y = max(ls.s.y, ls.e.y) 0 == cross(P, ls.s, ls.e); } 判断点是否在线段上 给定线段ls,端点分别是ls.s和ls.e,以及一点P,问P是否在线段上 仅仅判断叉积为0是不够的 满足条件的点必须
原创力文档


文档评论(0)