cocos2d-x JS 各类点、圆、矩形之间的简单碰撞检测
这里总结了一下点、圆、矩形之间的简单碰撞检测算法
(ps:矩形不包括旋转状态)
点和圆的碰撞检测:
1.计算点和圆心的距离
2.判断点与圆心的距离是否小于圆的半
- isCollision: function(point, circle)
- {
- //点与圆心的距离
- var distance = Math.sqrt(Math.pow(point.x - circle.x, 2) + Math.pow(point.y - circle.y, 2));
- //圆的半径
- var radius = circle.getContentSize().width / 2;
- //如果点与圆心距离小于圆的半径,返回true
- if(radius > distance)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
点和矩形的碰撞检测:
1.获得矩形的左上角坐标p1和右下角坐标p2
2.判断点p的x坐标是否大于p1的x坐标,并且小于p2的x坐标,并且p的y坐标大于p2的y坐标,并且小于p2
- isCollision: function(point, rect)
- {
- //获得矩形的左上角坐标p1和右下角坐标p2
- var p1 = cc.p(rect.x - rect.width/2, rect.y + rect.height/2);
- var p2 = cc.p(rect.x + rect.width/2, rect.y - rect.height/2);
- //判断点p的x坐标是否大于p1的x坐标,并且小于p2的x坐标,并且p的y坐标大于p2的y坐标,并且小于p2的y坐标
- if(point.x > p1.x && point.x < p2.x && point.y > p2.y && point.y < p1.y)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
圆和圆的碰撞检测:
1.计算两圆心之间的距离
2.判断两圆心之间的距离是否小于两圆的半径之和
- isCollision: function(circle1, circle2)
- {
- //圆心与圆心的距离
- var distance = Math.sqrt(Math.pow(circle1.x - circle2.x, 2) + Math.pow(circle1.y - circle2.y, 2));
- //圆心半径
- var r1 = circle1.getContentSize().width / 2;
- var r2 = circle2.getContentSize().width / 2;
- //如果圆心与圆心距离小于两圆的半径,返回true
- if(r1 + r2 > distance)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
矩形和矩形的碰撞检测:
在水平方向上,判断两个矩形中点x坐标的距离是否小于两个矩形宽度一半之和
在垂直方向上,判断两个矩形中点y坐标的距离是否小于两个矩形高度一半之和
- isCollision: function(rect1, rect2)
- {
- //获取矩形1的宽高
- var width1 = rect1.width;
- var height1 = rect1.height;
- //获取矩形2的宽高
- var width2 = rect2.width;
- var height2 = rect2.height;
- var flag;
- if(rect1.x >= rect2.x && rect2.x <= rect1.x - width1/2 - width2/2)
- {
- flag = false;
- }
- else if(rect1.x <= rect2.x && rect2.x >= rect1.x + width1/2 + width2/2)
- {
- flag = false;
- }
- else if(rect1.y >= rect2.y && rect2.y <= rect1.y - height1/2 - height2/2)
- {
- flag = false;
- }
- else if(rect1.y <= rect2.y && rect2.y >= rect1.y + height1/2 + height2/2)
- {
- flag = false;
- }
- else
- {
- flag = true;
- }
- }
圆和矩形的碰撞检测:
- isCollision: function(circle, rect)
- {
- //圆的半径
- var radius = circle.width / 2;
- //圆形中心与矩形中心的相对坐标
- var x = circle.x - rect.x;
- var y = circle.y - rect.y;
- var minX = Math.min(x, rect.width/2);
- var maxX = Math.max(minX, -rect.width/2);
- var minY = Math.min(y, rect.height/2);
- var maxY = Math.max(minY, -rect.height/2);
- if((maxX - x) * (maxX - x) + (maxY - y) * (maxY - y) <= radius * radius)
- {
- return true;
- }
- else
- {
- return false;
- }
- }
源码下载:点击打开链接
cocos2d-x JS 各类点、圆、矩形之间的简单碰撞检测的更多相关文章
- html+js+highcharts绘制圆饼图表的简单实例
下面我就为大家带来一篇html+js+highcharts绘制圆饼图表的简单实例.我觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随我过来看看吧 实例如下: 1 2 3 4 5 6 7 8 ...
- JS计算两个日期之间的天数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- js时间戳与日期格式之间相互转换
###js时间戳与日期格式之间相互转换 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法, ...
- 【Android进阶】Android程序与JavaScript之间的简单调用
本篇将讲解一个简单的Android与JavaScript之间的简单调用的小程序 效果图 工程结构 HTMLActivity.java代码 package com.example.javatojs; i ...
- js跨域请求jsonp解决方案-最简单的小demo
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
Visual Studio 2017中使用正则修改部分内容 最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...
- JS获取各种宽度、高度的简单介绍:
JS获取各种宽度.高度的简单介绍: scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获 ...
- 修改js confirm alert 提示框文字的简单实例
修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...
- Intercooler.js – 让 AJAX 像锚标签一样简单
使用 Intercooler,你可以添加 Ajax 到你的应用程序,而无需使用客户端模式的路由,认证,渲染,工厂或依赖注入.事实上,你不需要写任何的 JavaScript 代码.Intercooler ...
随机推荐
- Python PIL 的image类和numpy array之间的互换
import cv2 import numpy as np from PIL import Image from PIL import ImageEnhance def getline(frame): ...
- SparkR-Install
SparkR-Install 时间:2017-03-30 23:05:18 阅读:17 评论:0 收藏:0 [点我收藏+] 标签:too 下载 安装jd ...
- linux下从一台服务器复制文件或文件夹到本地
1.从服务器复制文件到本地:scp root@×××.×××.×××.×××:/data/test.txt /home/myfile/ root@×××.×××.×××.××× root是目标服务 ...
- stl综合
区别: List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]. Vector ...
- js和css实现手机横竖屏预览思路整理
实现效果,如上图. 首先,实现手机页面在PC端预览, 则先在网上找到一个手机的背景图片,算好大概内间距,用来放预览的页面,我这里是给手机预览页面的尺寸按iphone5的尺寸来的: 一个手机页面在这里预 ...
- CentOS6.5 添加开机自启动脚本
有时候我们需要Linux系统在开机的时候自动加载某些脚本或系统服务.在解问题之前先来看看Linux的启动流程. 一.Linux的启动流程 主要顺序就是: 1. 加载内核 2. 启动初始化进程 3. 确 ...
- RTX参数配置
RTX操作系统的配置工作是通过配置文件RTX_Conf_CM.c实现. 在MDK工程中打开文件RTX_Conf_CM.c,可以看到如下图5.2所示的工程配置向导: 20 Task C ...
- [转]Python中__repr__和__str__区别
class Test(object): def __init__(self, value='hello, world!'): self.data = value >>> t = Te ...
- 使用RecyclerView设置自定义分割线
在安卓开发中,RecyclerView控件来做一些列表是非常方便的,如何使用在网上很多文章,这次着重来说一下怎么设置自定义分割线: 首先,我们来看一下怎么设置默认的分割线 RecyclerView m ...
- 转载:sigmoid和softmax总结
转自:http://blog.csdn.net/u014422406/article/details/52805924 sigmoid函数(也叫逻辑斯谛函数): 引用wiki百科的定义: A logi ...