本来想画个图演示一下,但是折腾了一会发现画不好,我的win10系统没有安装office,以后再看的话再补上吧。不废话了。

  如图所以,如果判断点P是否被矩形A所包含,非常容易。那么如果矩形A以中心点逆时针旋转30度呢?有兴趣的同学可以去研究一下OBB算法,应该会有一些思路。我个人的思路是矩形A以中心点逆时针旋转30度,相当于点P以矩形A的中心点顺时针旋转30度,那么就相当于判断点D是否被矩形A包含,这就是我们熟悉的判断方法了。那么如何求出旋转后的D点的坐标呢, 这里我是用仿射变化的方法,如果还记得初高中数学知识的话,也可以自己算一下。

  用仿射矩阵的话,需要用到三个矩阵,分别是点P移动到A的中心点的平移矩阵matrix1,旋转30的旋转矩阵matrix2,从A的中心点移动到P的平移矩阵matrix33。D=matrix1*matrix2*matrix3*P。下面是我的一些代码。

-- 获取绕point点旋转的旋转矩阵
function QGetRotateMatrix(point, anAngle)
local unitMatrix = CCAffineTransformMakeIdentity() -- 单位矩阵
local matrix1 = CCAffineTransformTranslate(unitMatrix, -point.x, -point.y)
local matrix2 = CCAffineTransformRotate(unitMatrix, anAngle)
local matrix3 = CCAffineTransformTranslate(unitMatrix, point.x, point.y)
local matrix = CCAffineTransformConcat(matrix1, matrix2)
matrix = CCAffineTransformConcat(matrix, matrix3)
return matrix
end -- 获取旋转anAngle角度后的矩形
--[[--
@param anAngle CCRect 未旋转矩形
@param anAngle value 旋转角度
--]]--
function QGetRotateRect(rect, anAngle)
local cx = rect.origin.x + rect.size.width * 0.5
local cy = rect.origin.y + rect.size.height * 0.5
local centerPoint = qccp(cx, cy) local matrix = QGetRotateMatrix(centerPoint, anAngle)
local lb = ccp(rect.origin.x, rect.origin.y)
local lt = ccp(rect.origin.x, rect.size.height+rect.origin.y)
local rt = ccp(rect.size.width+rect.origin.x, rect.size.height+rect.origin.y)
local rb = ccp(rect.size.width+rect.origin.x, rect.origin.y)
lb = CCPointApplyAffineTransform(lb, matrix)
lt = CCPointApplyAffineTransform(lt, matrix)
rt = CCPointApplyAffineTransform(rt, matrix)
rb = CCPointApplyAffineTransform(rb, matrix) return lb, lt, rt, rb
end -- 判断旋转后的矩形是否包围point,理论上同样适应未旋转的矩形
--[[--
@param rect CCRect 未旋转的矩形
@param point qccp 需要判断的点
@param anAngle value 旋转角度
--]]--
function QRotateRectContainPoint(rect, anAngle, point)
local cx = rect.origin.x + rect.size.width * 0.5
local cy = rect.origin.y + rect.size.height * 0.5
local centerPoint = ccp(cx, cy) local matrix = QGetRotateMatrix(centerPoint, anAngle)
local rotatePoint = CCPointApplyAffineTransform(point, matrix) local bRet = false
if rotatePoint.x >= rect.origin.x and
rotatePoint.x <= rect.origin.x + rect.size.width and
rotatePoint.y >= rect.origin.y and
rotatePoint.y <= rect.origin.y + rect.size.height then
bRet = true
end return bRet;
end

里面用到了一些cocos2d的矩阵函数,不懂的可以去看下源码。

cocos2d 判断旋转矩形是否包含某个点的更多相关文章

  1. Atitit.java图片图像处理attilax总结  BufferedImage extends java.awt.Image获取图像像素点image.getRGB(i, lineIndex); 图片剪辑/AtiPlatf_cms/src/com/attilax/img/imgx.javacutImage图片处理titit 判断判断一张图片是否包含另一张小图片 atitit 图片去噪算法的原理与

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...

  2. Atitit 判断判断一张图片是否包含另一张小图片

    Atitit 判断判断一张图片是否包含另一张小图片 1. keyword1 2.  模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1 3. 匹配效果2 4. 图片相似度的算法(感知哈希算 ...

  3. Jquery判断数组中是否包含某个元素$.inArray()的用法

    判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...

  4. PHP判断字符串中是否包含指定字符串,支持中文哦

    RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...

  5. SQL判断字符串里不包含字母

    Oracle: 方法一:通过To_Number 函数异常来判断,因为这个函数在转换不成功的时候是报错,所以只能用存储过程包装起来. CREATE OR REPLACE FUNCTION Is_Numb ...

  6. 161101、在Java中如何高效判断数组中是否包含某个元素

    如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...

  7. String的两个API,判断指定字符串是否包含另一字符串,在字符串中删除指定字符串。

    // 在字符串中删除指定字符串. String phoneNum="1795112345"; phoneNum = phoneNum.replace("17951&quo ...

  8. html --- SVG --- javascript --- 旋转矩形

    可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML), 用于描述二维矢量图形的一种图形格式.SVG由W3C制定,是一个开放标准. 在 Inte ...

  9. [C#]判断字符串中是否包含中文

    关键代码: /// <summary> /// 判断字符串中是否包含中文 /// </summary> /// <param name="str"&g ...

随机推荐

  1. Python魔法方法(转发整合)

    如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而这一切都是自动发生的. __new__: 是一个对象实例化时调用的第一 ...

  2. handsontable 方法汇总

    核心方法 1.为handsontable添加钩子方法 addHook(key,callback):key为钩子方法名 例如:hot.addHook('beforeInit', myCallback); ...

  3. 搭建maven

    1. 下载安装包 打开网址https://maven.apache.org/download.cgi,找到下面这个文件进行下载 2. 解压安装 解压刚下载地文件到自己想要得目录下 3. 配置环境变量 ...

  4. QTcreator打包发布可运行程序(基于QT5.7)

    完成C++界面程序后,我们还需要对程序进行Release,然后进行打包,才可以直接运行.我在这期间绕了一个大弯,现在记录下来我的做法供参考. 正确步骤 第一步:将构建程序改为Release,然后构建项 ...

  5. 如何在WordPress文本小工具中使用PHP

    只需添加以下代码片段到你当前主题的functions.php文件 add_filter('widget_text', 'php_text', 99); function php_text($text) ...

  6. pc端响应式-媒体查询

    媒体查询(@media):能在不同的条件下使用不同的样式,使页面在不同在终端设备下达到不同的渲染效果 列举常用的pc屏幕宽度: 1024  1280  1366  1440  1680  1920  ...

  7. IPFS开发团队是如何工作的?

    小编不是一个很八卦的人,连当红明星都认不全.不过,今天还是带领大家来扒一扒ipfs开发团队是如何工作的. 工作方式: 全体会议:每周一有一个全体会议,这个会议是提前安排好的一个日程 任务讨论:把大任务 ...

  8. Java面向对象特性--多态

    Java是一种面向对象的编程语言,面向对象的三大特性就是继承,封装,多态.下面细细说一说多态. 多态的定义:一个事物的多种形态,指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而 ...

  9. JavaSE中常见的工具类

    Arrays 用来操作数组, 常用方法是 sort()和toString()方法 Iterator 我们常说的迭代器就是这哥们,专门用来操作集合元素的工具类 常用方法是: hasNex()t和next ...

  10. Spring容器中Bean的生命周期