这里总结了一下点、圆、矩形之间的简单碰撞检测算法

(ps:矩形不包括旋转状态)

点和圆的碰撞检测:

1.计算点和圆心的距离

2.判断点与圆心的距离是否小于圆的半


  1. isCollision: function(point, circle)
  2. {
  3. //点与圆心的距离
  4. var distance = Math.sqrt(Math.pow(point.x - circle.x, 2) + Math.pow(point.y - circle.y, 2));
  5. //圆的半径
  6. var radius = circle.getContentSize().width / 2;
  7. //如果点与圆心距离小于圆的半径,返回true
  8. if(radius > distance)
  9. {
  10. return true;
  11. }
  12. else
  13. {
  14. return false;
  15. }
  16. }

点和矩形的碰撞检测:
1.获得矩形的左上角坐标p1和右下角坐标p2
2.判断点p的x坐标是否大于p1的x坐标,并且小于p2的x坐标,并且p的y坐标大于p2的y坐标,并且小于p2

  1. isCollision: function(point, rect)
  2. {
  3. //获得矩形的左上角坐标p1和右下角坐标p2
  4. var p1 = cc.p(rect.x - rect.width/2, rect.y + rect.height/2);
  5. var p2 = cc.p(rect.x + rect.width/2, rect.y - rect.height/2);
  6. //判断点p的x坐标是否大于p1的x坐标,并且小于p2的x坐标,并且p的y坐标大于p2的y坐标,并且小于p2的y坐标
  7. if(point.x > p1.x && point.x < p2.x && point.y > p2.y && point.y < p1.y)
  8. {
  9. return true;
  10. }
  11. else
  12. {
  13. return false;
  14. }
  15. }

圆和圆的碰撞检测:
1.计算两圆心之间的距离
2.判断两圆心之间的距离是否小于两圆的半径之和

  1. isCollision: function(circle1, circle2)
  2. {
  3. //圆心与圆心的距离
  4. var distance = Math.sqrt(Math.pow(circle1.x - circle2.x, 2) + Math.pow(circle1.y - circle2.y, 2));
  5. //圆心半径
  6. var r1 = circle1.getContentSize().width / 2;
  7. var r2 = circle2.getContentSize().width / 2;
  8. //如果圆心与圆心距离小于两圆的半径,返回true
  9. if(r1 + r2 > distance)
  10. {
  11. return true;
  12. }
  13. else
  14. {
  15. return false;
  16. }
  17. }

矩形和矩形的碰撞检测:

在水平方向上,判断两个矩形中点x坐标的距离是否小于两个矩形宽度一半之和

在垂直方向上,判断两个矩形中点y坐标的距离是否小于两个矩形高度一半之和

  1. isCollision: function(rect1, rect2)
  2. {
  3. //获取矩形1的宽高
  4. var width1 = rect1.width;
  5. var height1 = rect1.height;
  6. //获取矩形2的宽高
  7. var width2 = rect2.width;
  8. var height2 = rect2.height;
  9. var flag;
  10. if(rect1.x >= rect2.x && rect2.x <= rect1.x - width1/2 - width2/2)
  11. {
  12. flag = false;
  13. }
  14. else if(rect1.x <= rect2.x && rect2.x >= rect1.x + width1/2 + width2/2)
  15. {
  16. flag = false;
  17. }
  18. else if(rect1.y >= rect2.y && rect2.y <= rect1.y - height1/2 - height2/2)
  19. {
  20. flag = false;
  21. }
  22. else if(rect1.y <= rect2.y && rect2.y >= rect1.y + height1/2 + height2/2)
  23. {
  24. flag = false;
  25. }
  26. else
  27. {
  28. flag = true;
  29. }
  30. }

圆和矩形的碰撞检测:

  1. isCollision: function(circle, rect)
  2. {
  3. //圆的半径
  4. var radius = circle.width / 2;
  5. //圆形中心与矩形中心的相对坐标
  6. var x = circle.x - rect.x;
  7. var y = circle.y - rect.y;
  8. var minX = Math.min(x, rect.width/2);
  9. var maxX = Math.max(minX, -rect.width/2);
  10. var minY = Math.min(y, rect.height/2);
  11. var maxY = Math.max(minY, -rect.height/2);
  12. if((maxX - x) * (maxX - x) + (maxY - y) * (maxY - y) <= radius * radius)
  13. {
  14. return true;
  15. }
  16. else
  17. {
  18. return false;
  19. }
  20. }

源码下载:点击打开链接

cocos2d-x JS 各类点、圆、矩形之间的简单碰撞检测的更多相关文章

  1. html+js+highcharts绘制圆饼图表的简单实例

    下面我就为大家带来一篇html+js+highcharts绘制圆饼图表的简单实例.我觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随我过来看看吧 实例如下: 1 2 3 4 5 6 7 8 ...

  2. JS计算两个日期之间的天数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. js时间戳与日期格式之间相互转换

    ###js时间戳与日期格式之间相互转换 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 /** 1. 下面是获取时间日期的方法, ...

  4. 【Android进阶】Android程序与JavaScript之间的简单调用

    本篇将讲解一个简单的Android与JavaScript之间的简单调用的小程序 效果图 工程结构 HTMLActivity.java代码 package com.example.javatojs; i ...

  5. js跨域请求jsonp解决方案-最简单的小demo

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  6. Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作

    Visual Studio 2017中使用正则修改部分内容   最近在项目中想实现一个小工具,需要根据类的属性<summary>的内容加上相应的[Description]特性,需要实现的效 ...

  7. JS获取各种宽度、高度的简单介绍:

    JS获取各种宽度.高度的简单介绍: scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获 ...

  8. 修改js confirm alert 提示框文字的简单实例

    修改js confirm alert 提示框文字的简单实例: <!DOCTYPE html> <html> <head lang="en"> & ...

  9. Intercooler.js – 让 AJAX 像锚标签一样简单

    使用 Intercooler,你可以添加 Ajax 到你的应用程序,而无需使用客户端模式的路由,认证,渲染,工厂或依赖注入.事实上,你不需要写任何的 JavaScript 代码.Intercooler ...

随机推荐

  1. Mac 终端Terminal光标移动快捷键

    声明: 转载自: http://blog.csdn.net/lgm252008/article/details/8253519 在Mac系统中并没有Home.End等键,所以在使用时并不是特别的顺手, ...

  2. mybatis中_parameter使用和常用sql

    mybatis中_parameter使用和常用sql   mybatis中_parameter使用和常用sql 在用自动生成工具生成的mybatis代码中,总是能看到这样的情况,如下: <sel ...

  3. tracert traceroute

    二者都用于探测数据包从源到目的经过路由的IP,但两者探测的方法却有差别.不同点:一.应用环境不同tracert是应用在windows下.traceroute则是应用在linux/BSD/router/ ...

  4. 如何在 Fiddler Script 中 自定义 修改 Request 、 Response

    Fiddler是一个http协议调试代理工具,方便进行http请求的拦截处理.改写请求.返回值等. 在Rules菜单下:  此次更改请求 头 ,so go to OnBeforeRequest 或者 ...

  5. puppet(3) 变量、数据类型、表达式、条件判断语句-if、case、selector、unless

    puppet(4) 变量.数据类型.表达式.条件判断语句-if.case.selector语句 puppet变量: 1.名称必须以$开头:赋值使用=,支持追加赋值+=: 2.每个变量都有两种引用格式: ...

  6. 利用Python写入CSV文件的方法

    第一种:CSV写入中文 #! /usr/bin/env python # _*_ coding:utf- _*_ import csv csvfile = file('test.csv', 'wb') ...

  7. [原][openstack-pike][controller node][issue-4][horizon] dashboard access too low reasons[dashboard 访问太慢]

    本文持续更新... 原因一:  访问dashboard 很慢. 输入了用户名和密码还有project后,一直处于首页状态,等很久才进入(暂且不考虑硬件.硬件暂时假设都满足条件) 首先想到的是memca ...

  8. 记录一份Oracle 正确的监听配置文件listener.ora与tnsnames.ora

    一.前言 昨天中午接到领导指示,有其他组的负责人B在厄瓜多尔演示他们组的产品,然后我们组的负责人就想说也在那边搭一套环境,(北美那边的亚马逊云环境),让B帮忙演示下我们的系统. 于是,开始了一个比较曲 ...

  9. ZooKeeper-3.3.4集群安装配置

    https://blog.csdn.net/shirdrn/article/details/7183503

  10. GBDT 详解分析 转+整理

    GBDT DT 回归树 Regression Decision Tree 梯度迭代 GBDT工作过程实例 需要解释的三个问题 - 既然图1和图2 最终效果相同,为何还需要GBDT呢? - Gradie ...