如何判断一个点在旋转后的矩形中

栏目: IT技术 · 发布时间: 5年前

内容简介:我这个矩形锚点为为(0.5,0.5),如果锚点不是(0.5,0.5)可以自行修改。但是判断一个点在旋转后的矩形中就没有这么简单了。以上就是如何判定一个点在旋转后的矩形中的一种方式。在网上搜索的时候发现有很多种实现方式,但是感觉都比较繁琐。有兴趣的小伙伴可以自己去研究研究。不过用我这个判定函数已经可以达到目的了。

前言

最近在做的一款游戏中,用到点与旋转矩形的判定来获得一个选中的物体。在此做个记录

如何判断一个点在旋转后的矩形中

如图所示,黄色的颜料屏是旋转的,如果不做处理直接判断点是否在矩形中,那么点击红点的位置会判定为选中物体。显然这是不对的。

如果物体没有旋转,判断方法就很简单了。

static isPositionInRect(point: cc.Vec2, rect: cc.Rect) {
        return point.x <= rect.x + rect.width/2 && point.x >= rect.x  - rect.width/2 && point.y <= rect.y + rect.height /2&& point.y >= rect.y - rect.height /2;
    }

我这个矩形锚点为为(0.5,0.5),如果锚点不是(0.5,0.5)可以自行修改。

但是判断一个点在旋转后的矩形中就没有这么简单了。

怎么判断呢?

  1. 首先我想到的是WebGL编程指南第92页讲到的内容。(x,y)在旋转O角度后得到(x2,y2)
x2 = x * cos(O) - y * sin(O)
 y2 = x * sin(O) + y * cos(O)
  1. 得到了这个公式,我们接下来就是要旋转触摸点了。不过这个时候我们要确定要绕哪个点旋转,是坐标系的原点吗?不是的,而是我们要碰撞的矩形的中心点,因为矩形是绕这个点旋转的。

    如何判断一个点在旋转后的矩形中
  2. 最终我们得到一个完整的判定函数

/**
     * 判断点是否在旋转后的矩形中
     * @param point 触摸点的坐标
     * @param node 碰撞节点,锚点必须为(0.5,0.5)
     */
    static isPosInRotationRect(point: cc.Vec2, node: cc.Node) {
        let hw = node.width / 2;
        let hh = node.height / 2
        let O = node.angle;
        let center = node.position;
        let X = point.x
        let Y = point.y
        let r = -O * (Math.PI / 180)
        let nTempX = center.x + (X - center.x) * Math.cos(r) - (Y - center.y) * Math.sin(r);
        let nTempY = center.y + (X - center.x) * Math.sin(r) + (Y - center.y) * Math.cos(r);
        if (nTempX > center.x - hw && nTempX < center.x + hw && nTempY > center.y - hh && nTempY < center.y + hh) {
            return true;
        }
        return false
    }
  1. 这里边需要注意的是角度O我们用的是反方向的。因为我们判定使用的矩形的坐标和宽高是未旋转的,也就是下图的红色框。所以我们的触摸点需要反方向旋转角度O才能使用之前的判定方法。

    如何判断一个点在旋转后的矩形中

    当你点击了1的位置,经过反方向的旋转后会到达2的位置,然后与红色框的矩形判断,才会得到正确的判定结果。如果触摸点旋转的角度与矩形旋转的角度相同,那么点击1的位置就会向左移动,也会判定为选中,就会得到不正确的结果了。

结语

以上就是如何判定一个点在旋转后的矩形中的一种方式。在网上搜索的时候发现有很多种实现方式,但是感觉都比较繁琐。有兴趣的小伙伴可以自己去研究研究。不过用我这个判定函数已经可以达到目的了。

参考

  1. https://www.jianshu.com/p/bde70668b1bc
  2. https://www.deanhan.cn/js-point-in-rotate-rect.html
  3. https://blog.csdn.net/C_panpan/article/details/50476965?utm_source=blogxgwz1

长按下方二维码,关注《微笑游戏》公众号,获取更多精彩内容。

如何判断一个点在旋转后的矩形中

欢迎扫码关注公众号《微笑游戏》,浏览更多内容。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

C++程序设计

C++程序设计

谭浩强 / 清华大学出版社 / 2004-6-1 / 36.00元

《C++程序设计》作者深入调查了我国大学的程序设计课程的现状和发展趋势,参阅了国内外数十种有关C++的教材,认真分析了学习者在学习过程中遇到的困难,研究了初学者的认识规律。在本书中做到准确定位,合理取舍内容,设计了读者易于学习的教材体系,并且以通俗易懂的语言化解了许多复杂的概念,大大减少了初学者学习C++的困难。C++是近年来国内外广泛使用的现代计算机语言,它既支持面向过程的程序设计,也支持基于对......一起来看看 《C++程序设计》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码