zoukankan      html  css  js  c++  java
  • Android线段与矩形碰撞检测函数

    原理不明白。。网上找的代码。测试通过,记录一下。

        /**
        * <p> 判断线段是否在矩形内
        * <p> 
        * 先看线段所在直线是否与矩形相交,
        * 如果不相交则返回false,
        * 如果相交,
        * 则看线段的两个点是否在矩形的同一边(即两点的x(y)坐标都比矩形的小x(y)坐标小,或者大),
        * 若在同一边则返回false,
        * 否则就是相交的情况。
        * </p>
        * 
        * @param linePointX1 线段起始点x坐标
        * @param linePointY1 线段起始点y坐标
        * @param linePointX2 线段结束点x坐标
        * @param linePointY2 线段结束点y坐标
        * @param rectangleLeftTopX 矩形左上点x坐标
        * @param rectangleLeftTopY 矩形左上点y坐标
        * @param rectangleRightBottomX 矩形右下点x坐标
        * @param rectangleRightBottomY 矩形右下点y坐标
        * @return 是否相交
        */
        private boolean isLineIntersectRectangle(int linePointX1,int linePointY1,int linePointX2,int linePointY2,int rectangleLeftTopX,int rectangleLeftTopY,int rectangleRightBottomX,int rectangleRightBottomY) {
    
        int lineHeight = linePointY1 - linePointY2;
        int lineWidth = linePointX2 - linePointX1;
        // 计算叉乘
        int c = linePointX1 * linePointY2 - linePointX2 * linePointY1;
    
        if ((lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c >= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c <= 0)
        || (lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c <= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c >= 0)
        || (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c >= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c <= 0)
        || (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c <= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c >= 0)) {
                if (rectangleLeftTopX > rectangleRightBottomX) {
                    int temp = rectangleLeftTopX;
                    rectangleLeftTopX = rectangleRightBottomX;
                    rectangleRightBottomX = temp;
                }
                if (rectangleLeftTopY < rectangleRightBottomY) {
                    int temp = rectangleLeftTopY;
                    rectangleLeftTopY = rectangleRightBottomY;
                    rectangleRightBottomY = temp;
                }
                if ((linePointX1 < rectangleLeftTopX && linePointX2 < rectangleLeftTopX) 
                || (linePointX1 > rectangleRightBottomX && linePointX2 > rectangleRightBottomX) 
                || (linePointY1 > rectangleLeftTopY && linePointY2 > rectangleLeftTopY) 
                || (linePointY1 < rectangleRightBottomY && linePointY2 < rectangleRightBottomY)) {
                    return false;
                } else {
                    return true;
                }
            } else {
                return false;
            }
        }
  • 相关阅读:
    mysql 数据类型总结
    #微信小程序子传父 #小程序子组件向父组件传值 小程序子组件触发父组件中的事件
    #最近看到了一个写的很棒的系列文章专栏
    《MySQL45讲》读书笔记(四):索引
    《MySQL45讲》读书笔记(六):数据库事务概述
    《MySQL45讲》读书笔记(一):三大日志概述
    Java基础篇(05):函数式编程概念和应用
    数据采集组件:Flume基础用法和Kafka集成
    架构设计:数据服务系统0到1落地实现方案
    Java基础篇(04):日期与时间API用法详解
  • 原文地址:https://www.cnblogs.com/qing123/p/2893231.html
Copyright © 2011-2022 走看看