Javascript 矩形交集
TL;博士: 将2个相交矩形的交点分解为3个矩形,其中1个为相交区域 大家好 我目前正在开发一些东西,需要在地图上可视化一些数据。现在的情况是,每次用户在地图上移动时,我都会向api发出请求,告知: 给我这个矩形区域中包含的所有数据,例如ABCD,其中每个点都是一对 每次用户在地图上移动时都会发出此类请求,并且新的可视化区域不包含在最后一个可视化区域中 例如,用户进行了放大 不幸的是,这种请求有点重,我想对此进行一些优化 通常,当用户在地图上移动时,Img a发生的情况是,他要可视化的新区域Ex xian矩形与旧的可视化区域相交,我已经为其加载了数据 因此,与其请求整个新的abcd矩形,不如向api询问AZcX+aXYb图B中包含的所有数据 我正在努力寻找一个算法来计算给定的两个相交矩形,这两个矩形 任何帮助都将不胜感激, 谢谢Javascript 矩形交集,javascript,geometry,maps,geometry-surface,Javascript,Geometry,Maps,Geometry Surface,TL;博士: 将2个相交矩形的交点分解为3个矩形,其中1个为相交区域 大家好 我目前正在开发一些东西,需要在地图上可视化一些数据。现在的情况是,每次用户在地图上移动时,我都会向api发出请求,告知: 给我这个矩形区域中包含的所有数据,例如ABCD,其中每个点都是一对 每次用户在地图上移动时都会发出此类请求,并且新的可视化区域不包含在最后一个可视化区域中 例如,用户进行了放大 不幸的是,这种请求有点重,我想对此进行一些优化 通常,当用户在地图上移动时,Img a发生的情况是,他要可视化的新区域Ex
我很久以前就解决了这个问题。 我目前正在使用来显示我的地图,因此,在算法解决方案中,我指的是一些传单类 下面是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 [];
}