cocos2d 判断旋转矩形是否包含某个点
本来想画个图演示一下,但是折腾了一会发现画不好,我的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 判断旋转矩形是否包含某个点的更多相关文章
- 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); ...
- Atitit 判断判断一张图片是否包含另一张小图片
Atitit 判断判断一张图片是否包含另一张小图片 1. keyword1 2. 模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1 3. 匹配效果2 4. 图片相似度的算法(感知哈希算 ...
- Jquery判断数组中是否包含某个元素$.inArray()的用法
判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...
- PHP判断字符串中是否包含指定字符串,支持中文哦
RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...
- SQL判断字符串里不包含字母
Oracle: 方法一:通过To_Number 函数异常来判断,因为这个函数在转换不成功的时候是报错,所以只能用存储过程包装起来. CREATE OR REPLACE FUNCTION Is_Numb ...
- 161101、在Java中如何高效判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作.同时,这个问题在Stack Overflow中也是一个非常热门的问题.在投票比较高的几个答案中给出了几种 ...
- String的两个API,判断指定字符串是否包含另一字符串,在字符串中删除指定字符串。
// 在字符串中删除指定字符串. String phoneNum="1795112345"; phoneNum = phoneNum.replace("17951&quo ...
- html --- SVG --- javascript --- 旋转矩形
可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML), 用于描述二维矢量图形的一种图形格式.SVG由W3C制定,是一个开放标准. 在 Inte ...
- [C#]判断字符串中是否包含中文
关键代码: /// <summary> /// 判断字符串中是否包含中文 /// </summary> /// <param name="str"&g ...
随机推荐
- [BZOJ4542] [Hnoi2016] 大数 (莫队)
Description 小 B 有一个很大的数 S,长度达到了 N 位:这个数可以看成是一个串,它可能有前导 0,例如00009312345.小B还有一个素数P.现在,小 B 提出了 M 个询问,每个 ...
- Ajax模拟Form表单提交,含多种数据上传
---恢复内容开始--- Ajax提交表单.使用FormData提交表单数据和上传的文件(这里的后台使用C#获取,你可以使用Java一样获取) 有时候前台的数据提交到后台,不想使用form表单上传,希 ...
- .net core实现redisClient
引言 最近工作上有需要使用redis,于是便心血来潮打算自己写一个C#客户端.经过几天的努力,目前该客户端已经基本成型,下面简单介绍一下. 通信协议 要想自行实现redisClient,则必须先要了解 ...
- Django数据模型——通用字段选项
字段 一个模型最重要也是唯一必需的部分,是它定义的数据库字段 字段名称限制 1.字段名不能是python保留字,这样会导致python语法错误 2.字段不能包含连续一个以上的下划线,这样会和Djang ...
- route路由的顺序问题了数据包的转发流程
2018-02-28 15:29:26 [root@linux ~]# routeKernel IP routing tableDestination Gateway ...
- ASP.NET MVC编程——验证、授权与安全
1 验证 一般采用表单验证完成登陆验证,建议结合SSL使用.为限制控制器只能执行HTTPS,使用RequireHttpsAttribute 2 授权 对账户的权限的控制可以通过在控制器或控制器操作上 ...
- spring boot高性能实现二维码扫码登录(上)——单服务器版
前言 目前网页的主流登录方式是通过手机扫码二维码登录.我看了网上很多关于扫码登录博客后,发现基本思路大致是:打开网页,生成uuid,然后长连接请求后端并等待登录认证相应结果,而后端每个几百毫秒会循环查 ...
- 笔记:Spring Cloud Feign Hystrix 配置
在 Spring Cloud Feign 中,除了引入了用户客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix,默认情况下,Spring Cl ...
- Day4----------用户、群组、权限
一.创建用户 命令:useradd 详细信息: root:x:0:0:root:/root:/bin/bash 总共七位 tom:x:500:500: :/home/tom:/bin/bash 1.r ...
- 【ASP.NET Core】如何隐藏响应头中的 “Kestrel”
全宇宙人民都知道,ASP.NET Core 应用是不依赖服务器组件的,因此它可以独立运行,一般是使用支持跨平台的 Kestrel 服务器(当然,在 Windows 上还可以考虑用 HttpSys,但要 ...