【原创】《矩阵的史诗级玩法》连载三:判断一个点是否在矩形内(支持带旋转的)
2018-02-04 15:53
344 查看
发完上一篇文章之后,我的积极性突然被打击了下。在相关文章列表中,我找到了一个自己之前没听过的词语——影射几何。度娘告诉我,这门学科跟我所谓的“史诗级玩法”似乎有共通之处。也就是说,我拿来装逼的这玩意儿,不过是别人几百年前就玩烂了的一件玩具而已。但无论如何,我在三维家讲课,不少同事仍然表示收获颇丰,所以我选择了坚持。
判断点与图形的关系,已经是老生常谈的话题了。矩形和圆可谓是最Low的两种图形,究其原因,是其具备了太多基础几何的特性(解析几何以前所学习的教科书内容我都给归到基础几何的范畴),一些方式特殊并且难度很低的技巧即可把大部分实际问题给完美解决掉。
技术狂人重点关注的,往往是多边形的碰撞检测。它不仅应用广泛(游戏里各种复杂的图形都会用多边形近似表示),而且有深挖的空间(比如含洞,含岛,缠绕型多边形,都蕴含着各种高深的学问)。再者,多边形碰撞的效率优化也够大神们玩足几年了。
而我写的教程则把重点放到了矩阵的奇葩应用上。为了让大家在理解的过程中有个平缓的过渡,我就先从最简单的圆和矩形开始(上篇讲的就是圆)。讲课的时候,我是这篇文章和上一篇都安排到了同一节课上,但阅读博客的时间跟上课时间不一样。现在这个年代的读者大多都在利用碎片化的时间进行学习,所以我分成了两篇。
废话太多了,转入正题。
对于没被旋转的矩形来说,判断它在不在矩形内实在太简单了。如下图,只要判断点的x坐标是否大于-3小于3,并且y坐标是否大于-2小于2。
![](http://img.blog.csdn.net/20180204142643726?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWxvdmVhczIwMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
那么,如果矩形被旋转了呢?比如30度那样。
![](http://img.blog.csdn.net/20180204143016533?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWxvdmVhczIwMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
如果你理解了上一篇的套路,那我相信你已经猜到我接下来要怎么做了,就是矩形和要被判断的点一起旋转-30度,让矩形还原到旋转前的状态。
![](http://img.blog.csdn.net/20180204144305997?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWxvdmVhczIwMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
旋转完成,就可以用回最初的简单方法,判断坐标的范围。所以剩下来的问题只差如何求出被判断点旋转-30度之后的坐标了。
旋转角度跟平面坐标的关系几乎都基于三角函数(也有大神喜欢玩向量),现在我们也用类似的方法。
一个点在绕坐标原点O旋转的过程中,它到O的距离始终不变(理解成圆周运动就好了),此处我用字母R表示这个距离,如下图所示。
![](http://img.blog.csdn.net/20180204145346296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWxvdmVhczIwMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
R是可以根据勾股定理算出来的,但我们不急着算,因为这里还涉及角度。
此处,最重要的角度非OP与x轴的夹角莫属。如下图,假设∠POA=θ,那么显然,∠P'OA=θ-30°。为什么不是+30呢?这是因为现在所有的点都在y轴的负方向。所以用的是减而不是加。此外,θ在这里也是负数。
![](http://img.blog.csdn.net/20180204151059799?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWxvdmVhczIwMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在直角三角形OAP中,根据三角函数的定义,有OA/OP=cosθ,即x/R=cosθ,所以x可以用Rcosθ代替,类似地,P的y坐标就等于Rsinθ,而P'也不难推导出来了,如上图所示。
从这个式子来看,要解出R和θ才能代入计算。但实际上三角函数部分可以展开。代入两角和差三角函数公式就能得到
Rcos(θ-30°)=Rcosθcos30°+Rsinθsin30°
Rsin(θ-30°)=Rsinθcos30°-Rcosθsin30°
不懂得两角和差三角函数的朋友可以自行百度,以前我讲课的时候还把这个当常识了,却没想到还真的有人没学过或者还给了老师
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif)
,所以有一次我还特地讲了一节专门推导两角和差三角函数的课(有录视频的,有需要的我可以发网盘地址到这儿),这里就懒得再展开了。
展开式有个很神奇的地方,R和θ可以被完全消掉,因为Rcosθ=x,Rsinθ=y,所以有
Rcos(θ-30°)=Rcosθcos30°+Rsinθsin30°=xcos30°+ysin30°
Rsin(θ-30°)=Rsinsθcos30°-Rcosθsin30°=ycos30°-xsin30°
把x=2.5,y=-1代入,得到新坐标
X=xcos30°+ysin30°=1.665
Y=ycos30°-xsin30°=-2.117
旋转后的x在-3到3之间,但y不在-2到2之间,所以判断出来了(2.5,-1)这个点不在旋转了30度的矩形内。
同理,前面展示的(2.5,1.5)这个点,算出的结果是
X=xcos30°+ysin30°=2.915
Y=ycos30°-xsin30°=0.049
x在-3到3之间,y在-2到2之间,因此(2.5,1.5)这个点在旋转了30度的矩形内。
今天这篇文章,教科书的味道似乎浓了点,但是旋转的套路却又是矩阵变换的一种。因此说穿了,所谓的矩阵史诗级玩法,无非是中学数学的基因重组的结果。
![](http://img.blog.csdn.net/20180205165345461?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaWxvdmVhczIwMTQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
单独的缩放或者旋转,矩阵似乎没有存在的必要,但如果两种乃至以上的变换组合在一起,仍然用这两篇文章的单独套路来分析的话,就会显得有点绕了。所以下一篇文章,我会让缩放和旋转这两个物种来一次奇妙的合体,从而进化出真正高逼格的——嗯,矩阵,敬请期待!
判断点与图形的关系,已经是老生常谈的话题了。矩形和圆可谓是最Low的两种图形,究其原因,是其具备了太多基础几何的特性(解析几何以前所学习的教科书内容我都给归到基础几何的范畴),一些方式特殊并且难度很低的技巧即可把大部分实际问题给完美解决掉。
技术狂人重点关注的,往往是多边形的碰撞检测。它不仅应用广泛(游戏里各种复杂的图形都会用多边形近似表示),而且有深挖的空间(比如含洞,含岛,缠绕型多边形,都蕴含着各种高深的学问)。再者,多边形碰撞的效率优化也够大神们玩足几年了。
而我写的教程则把重点放到了矩阵的奇葩应用上。为了让大家在理解的过程中有个平缓的过渡,我就先从最简单的圆和矩形开始(上篇讲的就是圆)。讲课的时候,我是这篇文章和上一篇都安排到了同一节课上,但阅读博客的时间跟上课时间不一样。现在这个年代的读者大多都在利用碎片化的时间进行学习,所以我分成了两篇。
废话太多了,转入正题。
对于没被旋转的矩形来说,判断它在不在矩形内实在太简单了。如下图,只要判断点的x坐标是否大于-3小于3,并且y坐标是否大于-2小于2。
那么,如果矩形被旋转了呢?比如30度那样。
如果你理解了上一篇的套路,那我相信你已经猜到我接下来要怎么做了,就是矩形和要被判断的点一起旋转-30度,让矩形还原到旋转前的状态。
旋转完成,就可以用回最初的简单方法,判断坐标的范围。所以剩下来的问题只差如何求出被判断点旋转-30度之后的坐标了。
旋转角度跟平面坐标的关系几乎都基于三角函数(也有大神喜欢玩向量),现在我们也用类似的方法。
一个点在绕坐标原点O旋转的过程中,它到O的距离始终不变(理解成圆周运动就好了),此处我用字母R表示这个距离,如下图所示。
R是可以根据勾股定理算出来的,但我们不急着算,因为这里还涉及角度。
此处,最重要的角度非OP与x轴的夹角莫属。如下图,假设∠POA=θ,那么显然,∠P'OA=θ-30°。为什么不是+30呢?这是因为现在所有的点都在y轴的负方向。所以用的是减而不是加。此外,θ在这里也是负数。
在直角三角形OAP中,根据三角函数的定义,有OA/OP=cosθ,即x/R=cosθ,所以x可以用Rcosθ代替,类似地,P的y坐标就等于Rsinθ,而P'也不难推导出来了,如上图所示。
从这个式子来看,要解出R和θ才能代入计算。但实际上三角函数部分可以展开。代入两角和差三角函数公式就能得到
Rcos(θ-30°)=Rcosθcos30°+Rsinθsin30°
Rsin(θ-30°)=Rsinθcos30°-Rcosθsin30°
不懂得两角和差三角函数的朋友可以自行百度,以前我讲课的时候还把这个当常识了,却没想到还真的有人没学过或者还给了老师
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif)
,所以有一次我还特地讲了一节专门推导两角和差三角函数的课(有录视频的,有需要的我可以发网盘地址到这儿),这里就懒得再展开了。
展开式有个很神奇的地方,R和θ可以被完全消掉,因为Rcosθ=x,Rsinθ=y,所以有
Rcos(θ-30°)=Rcosθcos30°+Rsinθsin30°=xcos30°+ysin30°
Rsin(θ-30°)=Rsinsθcos30°-Rcosθsin30°=ycos30°-xsin30°
把x=2.5,y=-1代入,得到新坐标
X=xcos30°+ysin30°=1.665
Y=ycos30°-xsin30°=-2.117
旋转后的x在-3到3之间,但y不在-2到2之间,所以判断出来了(2.5,-1)这个点不在旋转了30度的矩形内。
同理,前面展示的(2.5,1.5)这个点,算出的结果是
X=xcos30°+ysin30°=2.915
Y=ycos30°-xsin30°=0.049
x在-3到3之间,y在-2到2之间,因此(2.5,1.5)这个点在旋转了30度的矩形内。
今天这篇文章,教科书的味道似乎浓了点,但是旋转的套路却又是矩阵变换的一种。因此说穿了,所谓的矩阵史诗级玩法,无非是中学数学的基因重组的结果。
单独的缩放或者旋转,矩阵似乎没有存在的必要,但如果两种乃至以上的变换组合在一起,仍然用这两篇文章的单独套路来分析的话,就会显得有点绕了。所以下一篇文章,我会让缩放和旋转这两个物种来一次奇妙的合体,从而进化出真正高逼格的——嗯,矩阵,敬请期待!
相关文章推荐
- 【原创】《矩阵的史诗级玩法》连载四:45度地图砖块所蕴含的矩阵基础知识(上)
- 【原创】《矩阵的史诗级玩法》连载一:写在前面的话
- 【原创】《矩阵的史诗级玩法》连载二:利用图形的几何特性简化问题
- 【原创】《矩阵的史诗级玩法》连载总目录
- 【原创】《矩阵的史诗级玩法》连载五:45度地图砖块所蕴含的矩阵基础知识(下)
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 判断一个点是否在旋转过任意角度的矩形内
- 判断一个矩阵是否为函数
- 74. Search a 2D Matrix--判断一个数是否在一个矩阵中
- JS学习41:判断浏览器是否支持某一个CSS3属性
- 判断一个字符串是否是一个字符串的旋转字符串
- 模板(网络流判断:是否存在一个一直行列和的矩阵)
- 怎样判断平面上一个矩形和一个圆形是否有重叠?
- 已知一个矩阵 A(m*n) 的元素每行每列都按从小到大有序, 试设计一个算法判断任一给定值 k 是否在矩阵 A(m*n) 中
- 判断一个字符串是否是另一个字符串旋转后的结果,假设有个函数Substring判断一个字符是否为另一个字符的子字符串并且这个函数只能用一次
- JavaScript 里如何判断一个字符串里是否存在某个字符串?(支持中文)
- 【c语言】判断一个字符串是否为另外一个字符串旋转之后的字符串
- 1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1
- 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右),某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。
- 判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进