2017-03-06 1 views
0

1 차원 평면에 두 개의 수평선이 주어 졌을 때. 나는 그들이 어떤 점에서 겹치는 지 확인하고 싶다.한 라인에 다른 라인의 일부가 포함되어 있는지 확인하십시오.

다음은 중첩의 몇 가지 예입니다. [1,2][2,3]과 같은 간격에는 테두리가 "만져"있지만 서로 겹치지 않습니다. [1,2]은 기본적으로 x 축의 1에서 x 축의 2까지가는 선입니다. 이러한 조건에 대한 검사의 완전한 세트를 어떤 내 질문은

enter image description here

. 첫 줄이 a라고하고 두 번째 줄이 b라고 가정하고 이것들을 생각해 냈습니다.

b.s <= a.s && b.e > a.s 
b.s <= a.s && b.e >= a.e 
b.s < a.e && b.e >= a.e 
b.s > a.s && b.e < a.s 

정말 복잡합니까? 두 줄이 겹치는 지/한 줄에 다른 줄이 있는지 쉽게 알 수있는 방법이 있습니까? 다른 방법 부정 조건

public boolean isOverlap(Interval i1, Interval i2) 
    { 
//  if(i2.start <= i1.start && i2.end > i1.start) 
//   return true; 
//   
//  if(i2.start <= i1.start && i2.end >= i1.end) 
//   return true; 
//   
//  if(i2.start < i1.end && i2.end >= i1.end) 
//   return true; 
//   
//  if(i2.start >= i1.start && i2.end <= i1.end) 
//   return true; 
//   
//  return false; 

     if(i2.start <= i1.start && i2.end <= i1.start) 
      return false; 

     if(i2.start >= i1.end && i2.end >= i1.end) 
      return false; 

     return true; 
    } 
+0

'a.s을

+0

@ n.m. 답장을 보내 주셔서 감사합니다.하지만이 조건이 추가되어야합니까? – PepperBoy

+0

아니요, 전체 조건입니다. 그것은 귀하의 수표를 대체합니다. a.s

답변

1

보고

Aliter 는 같은 축에 그들을 고려하고 단절을 확인하는 것입니다.

그러면 "가장 왼쪽 지점은 무엇입니까?"라고 말할 수 있습니다.

"왼쪽"에는 .l을, "오른쪽"에는 .r을 사용합니다.

leftmost = a.l < b.l ? a : b 
rightmost = leftmost == a ? b : a 

이제 가장 왼쪽에 가장 오른쪽에 하나만 있습니다. 이들이 오른쪽으로 연결되도록하려면 가장 왼쪽의 왼쪽과 오른쪽 사이에 왼쪽 부분이 있어야합니다.

모든 라인을 가정하면 적어도 길이 1이 있어야 다음 간단하게 수행 할 수 있습니다

connected = rightmost.l < leftmost.r ? true : false 
+0

당신의 게시물을 완전히 이해했는지 모르겠지만 사용 된 단어의 연결 끊김은 중복에 대한 긍정적 인 시나리오의 수보다 훨씬 적기 때문에 부정적인 조건을 확인하기 위해 나에게 아이디어를주었습니다. 놀랍게도 나는 같은 대답을 얻는다. 어느 쪽이든, 둘 다 옳다는 뜻이거나, 둘 다 잘못되었습니다. 위의 편집을보고 당신이 생각하는 것을 알려주십시오. – PepperBoy

+0

그게 효과가있다. 또한 한 줄로 줄일 수도 있습니다. N.M의 버전이 제대로 작동하는 것 같습니다. – FredMan

+0

왜'connected = (rightmost.l

관련 문제