关于Toleft的一点思考

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q__y__L/article/details/53545757

最近在看mooc上邓老师的《计算几何》教学视频链接,邓老师讲的很好。在学到如何判定一个点在三角形上时,邓老师的视频中给了一个行列式,老师提到行列式的正负号就可以判断一个点在直线的左边还是右边。但是没讲它是怎么来得,课下思考后才推出来了。

先看下面的图:
这里写图片描述
任给一个三角形,当你从某个顶点沿着三角形逆时针运动时,你会发现三角形内部的点始终在你的左手边。所以这就给了我们启示:如果能判断一个点在三条有向线段的左边,而且这三条有向线段构成一个三角形(首尾相接),那么这个点就在这个三角形内。


所以现在的问题是如何快速判断一个点在直线的左边还是右边。学过解析几何的同学都知道:利用两点的坐标就可以求出过2点的直线方程,而一条直线将平面分割成2个平面,如果我们指定这条直线的方向,那么就可以将要判定的点带入直线方程,看其符号:
这里写图片描述
如图,当p点坐标带入方程大于0,我们便得知p点位于直线左侧了。
原理上可行但是我们要求直线的方程,这样会不会过于麻烦了呢?确实,事实上,我们有更好的办法:向量。我们可以利用向量的叉积,如图:
这里写图片描述
AP×AB=AB×APpABAB×APAP×AB=APABsinθ,2
这里写图片描述
到这里我们的集合描述就差不多了。现在看一下代数性质。
假设有2个三维向量 a=(x1,y1,z1),b=(x2,y2,z2)
则叉积为:
a×b=ix1x2jy1y2kz1z2
当在平面上时,我们可以认为z分量为0,那么就有:

a×b=ix1x2jy1y2k00=(x1y2x2y1)k

a,bAPABABP
邓老师的课件上的公式却是一个3*3的行列式:
这里写图片描述
开始不明白这个怎么来得,后来才明白利用了行列式的技巧:
pxqxsxpyqysy111=pxqxpxsxpxpyqypysypy100

=0qxpxsxpx0qypysypy100=qxpxsxpxqypysypy

到这里就基本明白了。在实际编写程序的时候依然还是转化为代数:
这里写图片描述

参考文章:向量叉积和应用

猜你喜欢

转载自blog.csdn.net/q__y__L/article/details/53545757