检测两个线段是否相交 .可能大家不明白我的意图,因为这玩意看起来
很无聊.
今天就来点有用的,当然算法是基于上面这篇文章的,上面这篇文章是为了给这篇文章铺底.今天,
我们要来判断下一个点是否在一个多边形内.
为什么要检测一个点是否在多边形内,恩,主要是想用在 canvas 里来模拟底层的点击事件.
要知道,canvas 实际上是一个非常简单简洁的 api,只提供了几个绘图 api,非常底层,要利用这
些简单的特性制造复杂的应用,需要一个框架,作为一个动画框架,最重要的除了时间线和精灵的
概念,莫属于它的事件机制了.
当我们把一个 canvas 封装成一个框架的时候,canvas 里的东西都会被我们当成一个一个的
对象,然后为了操作这些对象,我们需要知道我们的鼠标是否点在了这些对象上,是在拖动对象,还
是点击了对象,还是离开了对象,我们需要把这些事件封装出来作为借口提供给框架使用者.
然而,canvas 没有给你提供任何事件,从底层来说,canvas 内所有的事件都只是一个在
canvas 上触发的事件,例如 canvas 被点击了,被拖动了.对于在 canvas 里你点到了什么,点
到了哪里,浏览器并没有提供原生的事件 api.于是,我们需要自己来封装.
canvas 内的对象千奇百怪,但是从二维角度来说,其实任何对象都是又多边形组成的或者就是
一个多边形,这个多边形,我们在程序中用它的顶点作为标记来存储.
先看一个 demo 吧:(在现代浏览器中查看)
http://www.html-js.com/mj/version1.0.3/lab/
point-rect-test.html
判断一个点是否在多边形内的算法:
有这样一个算法,假设现在有一个点和一个多边形,这个多边形可以是凸多边形也可以是凹多边
形.找到这个点,然后从这个点水平往左画一条射线,方向指向左边,然后你找一下这条射线和多边
形的各条边是否相交,统计一下相交的次数,如果相交偶数次,说明点在多边形外面,如果相交奇数
次,说明点在多边形内.具体可以多画画试试.
下面的程序中,点标识成对象{x:*,y:*},而多边形则表示成点的数组,可以有任意个点组成.
view source
print ?
01
//计算向量叉乘
02 varcrossMul=function(v1,v2){
03 returnv1.x*v2.y-v1.y*v2.x;