2016-11-12 129 views
2

我想实现一个函数,当给出两个代表行的对象时,返回它们是否重叠。检查范围重叠

这是它应该如何看起来像视觉。

实施例1:

checkOverlap({start: 0, end: 10}, {start: 8, end: 15}) 

在视觉上,将是:

0--------10 
    8-------15 
    ^overlap 

返回true

实施例2:

checkOverlap({start: 12, end: 15}, {start: 0, end: 10}) 

在视觉上,将是:

   12-------15 
0--------10 

       no overlap 

返回false

这里是我的功能,适用于一些但不是所有:

function checkOverlap(lineA, lineB) { 
    var result; 
    for(var a in lineA) { 
     for(var b in lineB) { 
      if(a.end > b.start) { 
       result = true; 
      } else { 
       result = true; 
      } 
     } 
    } 
    return result; 
} 
+0

* “它适用于一些但不是所有的” *为了什么输入不工作?从我可以告诉的是,它不应该工作。做一个'console.log(a,b)'看看'a'和'b'的值究竟是什么。另外,为什么你将相同的值赋给'if'和'else'块中的'result'?这意味着'result'将总是*为'true'。你认为“(A行中的变量)”是什么意思?你为什么使用循环? –

+0

对不起,它不工作,它只是输出真,其余的代码不工作 – sal

回答

2

尼娜·肖尔茨答案是行不通的,如。 a = {start:1,end:2},b = {start:0,end:10}。

如果线{开始:0,结束:10}和{启动:10,端:15}被计算为重叠:

function checkOverlap(lineA, lineB) { 
     return lineA.start >= lineB.start && lineA.start <= lineB.end || 
       lineA.end >= lineB.start && lineA.end <= lineB.end || 
       lineB.start >= lineA.start && lineB.start <= lineA.end || 
       lineB.end >= lineA.start && lineB.end <= lineA.end; 
    } 

如果不是:

function checkOverlap(lineA, lineB) { 
     return lineA.start > lineB.start && lineA.start < lineB.end || 
       lineA.end > lineB.start && lineA.end < lineB.end || 
       lineB.start > lineA.start && lineB.start < lineA.end || 
       lineB.end > lineA.start && lineB.end < lineA.end; 
    } 
+0

这不会工作在这个var lineA = {start:0,end:10}; var lineB = {start:10,end:20}; – sal

+0

在你的情况下,它应该算作重叠还是不重叠?如果不在所有情况下删除=登录 – pato

+0

并非所有情况下,某些应该等于true并且有一些为假 – sal

2

你可以核对对象的边界。

function checkOverlap(o1, o2) { 
 
    return (
 
     o1.start >= o2.start && o1.start <= o2.end || 
 
     o1.end >= o2.start && o1.end <= o2.end || 
 
     o2.start >= o1.start && o2.start <= o1.end || 
 
     o2.end >= o1.start && o2.end <= o1.end 
 
    ); 
 
} 
 

 
console.log(checkOverlap({start: 0, end: 10}, {start: 8, end: 15})); // true 
 
console.log(checkOverlap({start: 8, end: 15}, {start: 0, end: 10})); // true 
 
console.log(checkOverlap({start: 12, end: 15}, {start: 0, end: 10})); // false 
 
console.log(checkOverlap({start: 0, end: 10}, {start: 12, end: 15})); // false 
 
console.log(checkOverlap({start: 12, end: 15}, {start: 16, end: 17})); // false 
 
console.log(checkOverlap({start: 16, end: 17}, {start: 12, end: 15})); // false 
 
console.log(checkOverlap({start: 1, end: 2}, {start: 0, end: 10})); // true 
 
console.log(checkOverlap({start: 0, end: 10}, {start: 1, end: 2})); // true 
 

 
console.log(checkOverlap({start: 0, end: 10}, {start: 10, end: 20})); // true 
 
console.log(checkOverlap({start: 10, end: 20}, {start: 0, end: 10})); // true
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

它不会工作在这个var lineA = {start:0,end:10}; var lineB = {start:10,end:20};或者这个var lineA = {start:10,end:20}; var lineB = {start:0,end:10}; – sal

+1

@sal,返回'true'。那是不对的? –

0

重叠必须遵循两个条件

![enter image description here

  • o1.end - o2.start > 0 // >= 0 if 0-10 10-20 means overlapping

  • o2.end - o1.start > 0 // >= 0 if 10-20 0-10 means overlapping

function checkOverlap(o1, o2) { 
 
    return ((o1.end - o2.start) > 0 && (o2.end - o1.start) > 0) ? true : false; 
 
} 
 

 
console.log(checkOverlap({start: -10, end: 0}, {start: 0, end: 10})); // false 
 
console.log(checkOverlap({start: -20, end: -10}, {start: -5, end: 5})); // false 
 
console.log(checkOverlap({start: 5, end: 10}, {start: 10, end: 20})); // false 
 
console.log(checkOverlap({start: -10, end: 0}, {start: -5, end: 5})); // true 
 
console.log(checkOverlap({start: -5, end: 5}, {start: -10, end: 0})); // true 
 
console.log(checkOverlap({start: 0, end: 10}, {start: 5, end: 15})); // true 
 
console.log(checkOverlap({start: 5, end: 15}, {start: 0, end: 10})); // true
.as-console-wrapper { max-height: 100% !important; top: 0; }