网站大量收购独家精品文档,联系QQ:2885784924

js判断一个点是否在多边形内(重要).docVIP

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

前几天写过一篇文章:用js检测两个线段是否相交.可能大家不明白我的意图,因为这玩意看起来很无聊. 今天就来点有用的,当然算法是基于上面这篇文章的,上面这篇文章是为了给这篇文章铺底.今天,我们要来判断下一个点是否在一个多边形内. 为什么要检测一个点是否在多边形内,恩,主要是想用在canvas里来模拟底层的点击事件. 要知道,canvas实际上是一个非常简单简洁的api,只提供了几个绘图api,非常底层,要利用这些简单的特性制造复杂的应用,需要一个框架,作为一个动画框架,最重要的除了时间线和精灵的概念,莫属于它的事件机制了. 当我们把一个canvas封装成一个框架的时候,canvas里的东西都会被我们当成一个一个的对象,然后为了操作这些对象,我们需要知道我们的鼠标是否点在了这些对象上,是在拖动对象,还是点击了对象,还是离开了对象,我们需要把这些事件封装出来作为借口提供给框架使用者. 然而,canvas没有给你提供任何事件,从底层来说,canvas内所有的事件都只是一个在canvas上触发的事件,例如canvas被点击了,被拖动了.对于在canvas里你点到了什么,点到了哪里,浏览器并没有提供原生的事件api.于是,我们需要自己来封装. canvas内的对象千奇百怪,但是从二维角度来说,其实任何对象都是又多边形组成的或者就是一个多边形,这个多边形,我们在程序中用它的顶点作为标记来存储. 先看一个demo吧:(在现代浏览器中查看) /mj/version1.0.3/lab/point-rect-test.html 判断一个点是否在多边形内的算法: 有这样一个算法,假设现在有一个点和一个多边形,这个多边形可以是凸多边形也可以是凹多边形.找到这个点,然后从这个点水平往左画一条射线,方向指向左边,然后你找一下这条射线和多边形的各条边是否相交,统计一下相交的次数,如果相交偶数次,说明点在多边形外面,如果相交奇数次,说明点在多边形内.具体可以多画画试试. 下面的程序中,点标识成对象{x:*,y:*},而多边形则表示成点的数组,可以有任意个点组成. view source print? 01 //计算向量叉乘 02 ????var?crossMul=function(v1,v2){ 03 ????????return???v1.x*v2.y-v1.y*v2.x; 04 ????} 05 //判断两条线段是否相交 06 ????var?checkCross=function(p1,p2,p3,p4){ 07 ????????var?v1={x:p1.x-p3.x,y:p1.y-p3.y}, 08 ????????v2={x:p2.x-p3.x,y:p2.y-p3.y}, 09 ????????v3={x:p4.x-p3.x,y:p4.y-p3.y}, 10 ????????v=crossMul(v1,v3)*crossMul(v2,v3) 11 ????????v1={x:p3.x-p1.x,y:p3.y-p1.y} 12 ????????v2={x:p4.x-p1.x,y:p4.y-p1.y} 13 ????????v3={x:p2.x-p1.x,y:p2.y-p1.y} 14 ????????return?(v=0crossMul(v1,v3)*crossMul(v2,v3)=0)?true:false 15 ????} 16 //判断点是否在多边形内 17 ????var??checkPP=function(point,polygon){ 18 ????????var?p1,p2,p3,p4 19 ????????p1=point 20 ????????p2={x:-100,y:point.y} 21 ????????var?count=0 22 ????????//对每条边都和射线作对比 23 ????????for(var?i=0;ipolygon.length-1;i++){ 24 ????????????p3=polygon[i] 25 ????????????p4=polygon[i+1] 26 ????????????if(checkCross(p1,p2,p3,p4)==true){ 27 ????????????????count++ 28 ????????????} 29 ????????} 30 ????????p3=polygon[polygon.length-1] 31 ????????p4=polygon[0] 32 ????????if(checkCross(p1,p2,p3,p4)==true){ 33 ???????

文档评论(0)

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

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

1亿VIP精品文档

相关文档