元素相交检测

最近做一个项目,其中涉及到了一个相交检测的功能,现在分享出来共勉

首先先谈一谈满足什么样的条件,才能算两个元素是相交,下面是一个示意图:

Ax1是元素A的起点在x轴上的投影,Ax2是元素A的终点在x轴上的投影,Ay1是元素A的起点在y轴上的投影,Ay2是元素A的终点在y轴上的投影

Bx1是元素B的起点在x轴上的投影,Bx2是元素B的终点在x轴上的投影,By1是元素B的起点在y轴上的投影,By2是元素B的终点在y轴上的投影

当元素A和元素B在y轴和x轴的投影同时相交时,元素A和元素B才相交

元素A和元素B在x轴的投影相交的条件是:Ax1 <= Bx1 && Ax2 >= Bx1 || Ax1 <= Bx1 && Ax2 >= Bx2

元素A和元素B在y轴上的投影相交的条件是:Ay1 <= By1 && Ay2 >= By1 || Ay1 <= By1 && Bx2 >= By2

具体代码如下:

function compare(elemA,elemB,gap){
    var Booleans,elemAPos,elemBPos,
        elemAShadow_x,elemAShadow_y,
        elemBShadow_x,elemBShadow_y,
        intersect_x,intersect_y;
    //元素的位置
    elemAPos = elemA.offset();
    elemBPos = elemB.offset();

    //elemA的投影
    elemAShadow_x = [elemAPos.left, elemAPos.left + elemA.width()];
    elemAShadow_y = [elemAPos.top, elemAPos.top + elemA.height()];

    //elemB的投影
    elemBShadow_x = [elemBPos.left - gap, elemBPos.left + elemB.width() + gap];
    elemBShadow_y = [elemBPos.top - gap, elemBPos.top + elemB.height() + gap];

    //检测是否X轴上相交
    intersect_x = (elemAShadow_x[0] >= elemBShadow_x[0] && elemAShadow_x[0] <= elemBShadow_x[1])
        || (elemAShadow_x[1] >= elemBShadow_x[0] && elemAShadow_x[1] <= elemBShadow_x[1]);

    //检测是否Y轴上相交
    intersect_y = (elemAShadow_y[0] >= elemBShadow_y[0] && elemAShadow_y[0] <= elemBShadow_y[1])
        || (elemAShadow_y[1] >= elemBShadow_y[0] && elemAShadow_y[1] <= elemBShadow_y[1]);

    Booleans = intersect_x && intersect_y;
    return Booleans
}

关于参数gap的解释:因为在这个项目中要求的功能是,要求两个元素之间的间距为10px,当两个元素之间的间距小于等于10就视为相交。

这上说函数中使用了jquery这个库

时间: 2024-10-13 22:12:05

元素相交检测的相关文章

强大的CSS:scroll-snap滚动事件停止及元素位置检测

一.Scroll Snap是前端必备技能 CSS Scroll Snap是个非常好用的特性,可以让网页容器滚动停止的时候,无需任何JS代码的参与,浏览器可以自动平滑定位到指定元素的指定位置.类似幻灯片广告效果就可以纯CSS实现. 而且CSS Scroll Snap的兼容性非常好,移动端几乎可以放心使用. 二.源自实际项目的scroll-snap场景 今天下午在实现一个功能需求的时候,正好遇到一个场景非常适合使用Scroll Snap来实现,滑动依次显示人物角色.于是就大胆使用了下,哇,好棒,无需

web前端入门到实战:CSS:scroll-snap滚动事件停止及元素位置检测

一.Scroll Snap是前端必备技能 CSS Scroll Snap是个非常好用的特性,可以让网页容器滚动停止的时候,无需任何JS代码的参与,浏览器可以自动平滑定位到指定元素的指定位置.类似幻灯片广告效果就可以纯CSS实现. 而且CSS Scroll Snap的兼容性非常好,移动端几乎可以放心使用. 二.源自实际项目的scroll-snap场景 今天下午在实现一个功能需求的时候,正好遇到一个场景非常适合使用Scroll Snap来实现,滑动依次显示人物角色.于是就大胆使用了下,哇,好棒,无需

线段与非无限平面相交检测

参考自<游戏编程精粹1>,用该方法除了知道是否相交以外还可以得到相交点,从而用于其他判断. 原文用到了平面方程Ax+By+Cz+D=0,通过三角形求出平面,然后用方程求出线段交点 这里直接使用平面,以下为Unity中的实现代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Practice : MonoBehaviour { public Transfor

libgdx学习记录27——线段与线段相交检测

给定p1, p2, p3, p4四个点,p1,p2为一条线段,p3,p4为一条线段,检测其是否有交点. 可分为三种情况: 1. L2与x轴平行 2. L2与y轴平行 3. L2与坐标轴不平行. (L1与坐标轴平行,类似处理) 基本思路,求出交点坐标,并检测其是否在两个线段内即可. 检测代码: 1 public static float min(float x, float y) { return x<y? x: y; } 2 public static float max(float x, fl

判断元素是否在视口和元素相交

判断元素是否在视区内 function isElementInViewport (el) { var rect = el.getBoundingClientRect(); return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && /*or $(windo

Axiom3D:Ogre射线与点,线,面相交,鼠标操作3维空间.

在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点显示虽然不在一起,但是是一个Mesh.Ogre本身的检测只能检测到这里,在我们这不满足要求,相应的点,线,面检测都需要自己来计算. 在讲解本文之前,先看下射线的相关生成代码,只有先明白射线如何生成,生成最后是相对什么空间. [OgreVersion( 1, 7, 2790, "Slightly di

三维空间中线与三角形相交判定

——读Computer Graphics Principles and Practice 3rd Edition第七章时遇见课文正文和代码中的错误,作记. 本文旨在阐释一种算法,用于在三维空间中寻找某一线(ray)与某一三角形的交点.此算法是计算机图形学中的基础算法之一. 1.预设概念 为了阐释此算法,必须先引入一组预设概念,借以使用计算机语言来描述三维空间中的线与三角形. 我们首先给出这些概念的定义及数据结构. 1.1 点(Point3D) 我们使用笛卡尔坐标系 (Cartesian coor

常用的HTML5、CSS3新特性能力检测写法

伴随着今年10月底HTML5标准版的发布,未来使用H5的场景会越来越多,这是令web开发者欢欣鼓舞的事情.然而有一个现实我们不得不看清,那就是IE系列浏览器还占有一大部分市场份额,以IE8.9为主,windows8.1的用户已经用上了IE10/11,而考虑我国的国情,IE6.7依然存留不少.在我们放手用HTML5开发的时候,新特性支持度检测就是必不可少的了.一种方式是用navigator.userAgent或navigator.appName来检测浏览器类型和版本,不过这种方式不是很可靠,浏览器

浏览器检测工具Modernizr

什么是Modernizr? Modernizr 是一个用来检测浏览器功能支持情况的 JavaScript 库. 目前,通过检验浏览器对一系列测试的处理情况,Modernizr 可以检测18项 CSS3 功能以及40多项关于HTML5 的功能. 它比传统检测浏览器名称(浏览器嗅探)的方式更为可靠. 一整套测试的执行时间仅需几微秒. 此外,Modernizr 网站通过定制脚本只对你感兴趣的元素进行检测,从而实现效率优化. 传统浏览器目前不会被完全取代,令你难以将最新的 CSS3 或 Html5 功能