Javascript 矩形交集

Javascript 矩形交集,javascript,geometry,maps,geometry-surface,Javascript,Geometry,Maps,Geometry Surface,TL;博士: 将2个相交矩形的交点分解为3个矩形,其中1个为相交区域 大家好 我目前正在开发一些东西,需要在地图上可视化一些数据。现在的情况是,每次用户在地图上移动时,我都会向api发出请求,告知: 给我这个矩形区域中包含的所有数据,例如ABCD,其中每个点都是一对 每次用户在地图上移动时都会发出此类请求,并且新的可视化区域不包含在最后一个可视化区域中 例如,用户进行了放大 不幸的是,这种请求有点重,我想对此进行一些优化 通常,当用户在地图上移动时,Img a发生的情况是,他要可视化的新区域Ex

TL;博士:

将2个相交矩形的交点分解为3个矩形,其中1个为相交区域

大家好

我目前正在开发一些东西,需要在地图上可视化一些数据。现在的情况是,每次用户在地图上移动时,我都会向api发出请求,告知:

给我这个矩形区域中包含的所有数据,例如ABCD,其中每个点都是一对

每次用户在地图上移动时都会发出此类请求,并且新的可视化区域不包含在最后一个可视化区域中 例如,用户进行了放大

不幸的是,这种请求有点重,我想对此进行一些优化

通常,当用户在地图上移动时,Img a发生的情况是,他要可视化的新区域Ex xian矩形与旧的可视化区域相交,我已经为其加载了数据

因此,与其请求整个新的abcd矩形,不如向api询问AZcX+aXYb图B中包含的所有数据

我正在努力寻找一个算法来计算给定的两个相交矩形,这两个矩形

任何帮助都将不胜感激, 谢谢


我很久以前就解决了这个问题。 我目前正在使用来显示我的地图,因此,在算法解决方案中,我指的是一些传单类

下面是javascript代码,它将两个区域表示为传单L.LatLngBounds对象,返回一个L.LatLngBounds数组,这些数组是补充区域,即必须加载的区域

遵循js算法:

function getComplementaryBounds(oldBounds, newBounds){
  if (!((oldBounds instanceof L.LatLngBounds) && (newBounds instanceof L.LatLngBounds))){
    return [];
  }

  var buildLatLngBound = function (nwlng, nwlat, selng, selat){
    return new L.LatLngBounds(new L.LatLng(nwlat,nwlng),new L.LatLng(selat,selng));
  }

   var nwiix = newBounds.getNorthWest().lng;
   var nwiiy = newBounds.getNorthWest().lat;
   var nwix =  oldBounds.getNorthWest().lng;
   var nwiy =  oldBounds.getNorthWest().lat;

   var seiix = newBounds.getSouthEast().lng;
   var seiiy = newBounds.getSouthEast().lat;
   var seix =  oldBounds.getSouthEast().lng;
   var seiy =  oldBounds.getSouthEast().lat;

  if (!(newBounds.contains(oldBounds))){
    switch (true) {
     case (nwiix >= nwix && nwiiy >= nwiy):
       return [buildLatLngBound(nwiix, nwiiy, seix, nwiy), buildLatLngBound(seix, nwiiy, seiix, seiiy)];
     case (nwiix <= nwix && nwiiy >= nwiy):
       return [buildLatLngBound(nwix, nwiiy, seiix, nwiy), buildLatLngBound(nwiix, nwiiy, nwix, seiiy)];
     case (nwiix <= nwix && nwiiy <= nwiy):
       return [buildLatLngBound(nwiix, nwiiy, nwix, seiiy), buildLatLngBound(nwix, seiy, seiix, seiiy)];
     case (nwiix >= nwix && nwiiy <= nwiy):
        return [buildLatLngBound(nwiix, seiy, seix, seiiy), buildLatLngBound(seix, nwiiy, seiix, seiiy)];
      }
    } else {
      return[
            buildLatLngBound(nwiix, nwiiy,    seiix,  nwiy),
            buildLatLngBound(nwiix, nwiy,     nwix,   seiy),
            buildLatLngBound(seix,  nwiy,     seiix,  seiy),
            buildLatLngBound(nwiix, seiy,     seiix,  seiiy)
            ];
    }
    return [];
  }
function getComplementaryBounds(oldBounds, newBounds){
  if (!((oldBounds instanceof L.LatLngBounds) && (newBounds instanceof L.LatLngBounds))){
    return [];
  }

  var buildLatLngBound = function (nwlng, nwlat, selng, selat){
    return new L.LatLngBounds(new L.LatLng(nwlat,nwlng),new L.LatLng(selat,selng));
  }

   var nwiix = newBounds.getNorthWest().lng;
   var nwiiy = newBounds.getNorthWest().lat;
   var nwix =  oldBounds.getNorthWest().lng;
   var nwiy =  oldBounds.getNorthWest().lat;

   var seiix = newBounds.getSouthEast().lng;
   var seiiy = newBounds.getSouthEast().lat;
   var seix =  oldBounds.getSouthEast().lng;
   var seiy =  oldBounds.getSouthEast().lat;

  if (!(newBounds.contains(oldBounds))){
    switch (true) {
     case (nwiix >= nwix && nwiiy >= nwiy):
       return [buildLatLngBound(nwiix, nwiiy, seix, nwiy), buildLatLngBound(seix, nwiiy, seiix, seiiy)];
     case (nwiix <= nwix && nwiiy >= nwiy):
       return [buildLatLngBound(nwix, nwiiy, seiix, nwiy), buildLatLngBound(nwiix, nwiiy, nwix, seiiy)];
     case (nwiix <= nwix && nwiiy <= nwiy):
       return [buildLatLngBound(nwiix, nwiiy, nwix, seiiy), buildLatLngBound(nwix, seiy, seiix, seiiy)];
     case (nwiix >= nwix && nwiiy <= nwiy):
        return [buildLatLngBound(nwiix, seiy, seix, seiiy), buildLatLngBound(seix, nwiiy, seiix, seiiy)];
      }
    } else {
      return[
            buildLatLngBound(nwiix, nwiiy,    seiix,  nwiy),
            buildLatLngBound(nwiix, nwiy,     nwix,   seiy),
            buildLatLngBound(seix,  nwiy,     seiix,  seiy),
            buildLatLngBound(nwiix, seiy,     seiix,  seiiy)
            ];
    }
    return [];
  }