Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 查找一组垂直线段中所有不相交的交点_Javascript_Algorithm_Geometry - Fatal编程技术网

Javascript 查找一组垂直线段中所有不相交的交点

Javascript 查找一组垂直线段中所有不相交的交点,javascript,algorithm,geometry,Javascript,Algorithm,Geometry,我有一组由y1和y2坐标定义的垂直区域,其中y1是每个区域的起点,y2是每个区域的终点。我的坐标系的原点是左上角,所以y2总是大于y1 这是一个例子: var regions = [ [10, 100], [50, 120], [60, 180], [140, 220] ]; 我想找出所有大于一定尺寸的脱节交叉口,比如说,20个单元 到目前为止,我只能得到所有的交点:[50100],[60100],[60120],[140180],但我希望得到这个结果:[60100],[140

我有一组由y1和y2坐标定义的垂直区域,其中y1是每个区域的起点,y2是每个区域的终点。我的坐标系的原点是左上角,所以y2总是大于y1

这是一个例子:

var regions = [
  [10, 100],
  [50, 120],
  [60, 180],
  [140, 220]
];
我想找出所有大于一定尺寸的脱节交叉口,比如说,20个单元

到目前为止,我只能得到所有的交点:
[50100],[60100],[60120],[140180]
,但我希望得到这个结果:
[60100],[140180]
。 有什么算法可以得到这个结果吗


小提琴:

正如@MBo所说,似乎没有明确的理由选择交叉口
[60,100],[140,180]
,因为所有交叉口(
[50,100],[60,100],[60,120],[140,180]
)都明显多于20个。但是,如果出于某种原因,您仍然希望得到大于某个大小的交叉点,那么这里有一个程序:

sort regions by the lower bound of each element
for (i = 0; i < len; i++)
    for (j = i+1; j < len; j++)
        if the ith and jth region overlap and resultingSize > theSizeYouWant
            add to the list of valid intersections // or whatever you want
        else break
输出:

['50-100',60-100',60-120',140-180']

对于不同的输入

regions = [
  [70, 100],
  [50, 120],
  [80, 180],
  [150, 220]
]
输出:

['70-120',80-120',150-180']


如果这是你已经做过的琐碎的事情,我很抱歉,但也许有一些有用的东西…

我相信问题很清楚。它请求给定垂直边范围数组中的不相交交点。也就是说

[[10, 100], [50, 120], [60, 180], [140, 220]]
数组为我们提供了两个不相交的交集,一个来自
[10100],[50120],[60180]
并生成
[60100]
,另一个来自
[60180],[140220]
并生成
[140180]
。因此,正如您所注意到的,由此产生的交点
[60100]
[140180]
从这组给定的垂直边获得的交点是不相交的

在JS中实现此功能的一种方法如下:

函数GetDisjointedCrossons(a){
var di;
返回a.reduce((p,c,i,a)=>c.used?p
:(p.push(a.map((u,j)=>a[(i+j)%a.length])
.reduce((s,e)=>(di=[Math.max(s[0],e[0]),Math.min(s[1],e[1])),
di[0]log(getdisjointedcrossions(regions))您可以使用简化算法并使用叉积来搜索重叠项。然后通过迭代获得公共部分,并仅过滤未知匹配项

var区域=[[10100]、[50120]、[60180]、[140220],
hash=Object.create(null),
结果=区域。减少(函数(r,a){
var temp=区域减少(功能(s、b){
var min=Math.max(s[0],b[0]),max=Math.min(s[1],b[1]);
返回最小值<最大值?[最小值,最大值]:s;
},a),
键=临时连接(“|”);
if(key&!hash[key]){
哈希[键]=真;
r、 推动(温度);
}
返回r;
}, []);

控制台日志(结果)
我不明白你在这里的意思是什么,
[601100]
[50100]
[60100]是前三个区域之间的交点,[60100]和[140180]之间的交点是空的,所以它们是不相交的。我注意到[60100]的覆盖计数最大,但你没有提到这个事实的重要性。所以你暗示了这个标准,但没有描述它。请更详细地说明问题。我怀疑不同的标准可能会产生矛盾。我正在努力处理你的代码,一些注释对我很有用,因为我无法复制和粘贴你的解决方案……你能帮我理解算法吗?@deblocker好,我已经添加了一些解释。我希望它能帮助你。可能有一些更好的方法,但这是我昨天晚上晚些时候可能想到的。THX,我想小于给定大小的交叉口可以在推到外部阵列之前过滤掉,从而避免对所有返回的交叉口进行额外的最终传递。你同意吗?@deblocker好吧,我们不需要在输出上附加过滤器。它可以很好地过滤一个小的变化。我已经将代码重构为一个更为传统的代码,并包含在我的答案的末尾。我相信这样你能更好地理解。