最近在看编程之美,看到4.4节,讲如何判断一个点是否在三角形内部时,第二种解法:可以通过判断点是否在边射线的左边来判断点是否在三角形内部,顿时觉得很新奇,
但是看代码是,有点没看懂,为啥要用两个向量的叉积?能不能用点乘呢?
其实关于点积,叉积早不知道是什么了(如果你也像我迷惑看这里:http://blog.csdn.net/fox64194167/article/details/8147460),于是google了一下,叉积,但是看来看去也没看明白为啥这个叉积就可以判断?
又找小伙伴讨论,才搞明白。
现总结一下:
判断一个点是否在一条射线的左边可以转化成两个向量的叉积的方向只想问题
设点P1,和射线P0P2,则 两个向量分别为 : a = P0P2 , b = P0P1,
由叉积的定义:
对三维的两个向量a,b 而言
a×b = (aybz-azby) i + (azbx-axbz) j + (axby-aybx) k
=
假设 a , b 都是二维的则,
|a×b| = (axby-aybx),方向和a,b两向量构成的平面垂直;
根据右手定则:
一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的, 当右手的四指从 a 以不超过180度的转角转向 b 时,竖起的大拇指指向是 c 的方向。由于向量的叉积由坐标系确定,所以其结果被称为伪向量。
那么我们就可以根据 c 方向来判断点是在射线的左边还是右边,
判断原则如下:看(axby-aybx)的正负
1,如果 (axby-aybx) > 0 ,则点P0在射线P0P2的左边。
2,如果 (axby-aybx) = 0 ,则点P0在射线P0P2上。
3,如果 (axby-aybx) < 0 ,则点P0在射线P0P2的右边。
分析到这里编程很好实现了吧,(*^__^*) 嘻嘻……