几何常用算法与判断线段相交.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
几何常用算法与判断线段相交

下面这个函数在我写的计算几何库函数里面有,那个库可以在/的资源中心 ? - ? 代码角 ? 找到。 ? ? ? ? 算法简单说明: ? ? 首先判断以两条线段为对角线的矩形是否相交,如果不相交两条线段肯定也不相交。(所谓以a1b2为对角钱的矩形就是以两边长为|a1.x – b2.x|和|a1.y – b2.y|以及a1b2为对角线的矩形)如果相交的话,利用矢量叉乘判断两条线段是否相互跨越,如果相互跨越显然就相交,反之则不相交。算法不难,但是一些特殊情况需要考虑到,比如两条相段共线且在断点处相交。下面的代码经过测试了,应该没有bug,如果你真的发现了bug请告诉我:) ? ? ? ? /******************************************************** ? * * ? ? ? * 返回(P1-P0)*(P2-P0)的叉积。 * ? ? ? * 若结果为正,则P0,P1在P0,P2的顺时针方向; * ? ? ? * 若为0则P0,P1P0,P2共线; * ? ? ? * 若为负则P0,P1在P0,P2的在逆时针方向; * ? ? ? * 可以根据这个函数确定两条线段在交点处的转向, * ? ? ? * 比如确定p0p1和p1p2在p1处是左转还是右转,只要 ? ? * ? ? ? * ? ? ? ? ? ? ? 求(p2-p0)*(p1-p0),若0则左转,0则右转,=0则 ? * ? ? ? * ? ? ? ? ? ? ? 共线 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? * ? ? ? * * ? ? \********************************************************/ ? ? ? ? float ? multiply(TPoint ? p1,TPoint ? p2,TPoint ? p0) ? ? { ? ? return((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y)); ? ? } ? ? ? ? ? ? ? ? //确定两条线段是否相交 ? ? int ? intersect(TLineSeg ? u,TLineSeg ? v) ? ? { ? ? return( ? (max(u.a.x,u.b.x)=min(v.a.x,v.b.x)) ? ? ? ? ? ? ? ? ? ? (max(v.a.x,v.b.x)=min(u.a.x,u.b.x)) ? ? ? ? ? ? ? ? ? ? (max(u.a.y,u.b.y)=min(v.a.y,v.b.y)) ? ? ? ? ? ? ? ? ? ? (max(v.a.y,v.b.y)=min(u.a.y,u.b.y)) ?(以两线段为对角线的矩形是否相交) ? ? ? ? ? ? ? ? ? (multiply(v.a,u.b,u.a)*multiply(u.b,v.b,u.a)=0) ? ? ? ? ? ? ? ? ? ? (multiply(u.a,v.b,v.a)*multiply(v.b,u.b,v.a)=0));(是否相互跨立) ? ? } ? 忘记了说明TPoint和TLineSeg的定义了:) ? ? struct ? TPoint ? { ? ? float ? x,y; ? ? }; ? ? ? ? struct ? TLineSeg ? { ? ? TPoint ? a,b; ? ? }; ?上面的算法避免了除法运算,所以不会出现计算误差NOwcan兄的方法虽然简单,但是求两条直线的交点需要用到除法,当两条线段相交但是很接近平行的时候,会有精度上的误差,所以我的方法不用除法更好一点。这是计算几何中的经典算法计算几何常用算法(一共23个) ? ? ? ? 1. ? 矢量减法 ? ? ? ? 设二维矢量 ? P ? = ? (x1,y1) ? ,Q ? = ? (x2,y2) ? ? ? 则矢量减法定义为: ? P ? - ? Q ? = ? ( ? x1 ? - ? x2 ? , ? y1 ? - ? y2 ? ) ? ? 显然有性质 ? P ? - ? Q ? = ? - ? ( ? Q ? - ? P ? ) ? ? 如不加说明,下面所有的点都看作矢量,两点的减法就是矢量相减; ? ? ? ? 2.矢量叉积 ? ? ? ? 设矢量P ? = ? (x1,y1) ? ,Q ? = ? (x

文档评论(0)

liangyuehong + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档