Computer >> 컴퓨터 >  >> 프로그램 작성 >> JavaScript

JavaScript의 수직선 세그먼트 세트에서 모든 연결되지 않은 교차점 찾기

<시간/>

y1 및 y2 좌표로 정의된 수직 영역 세트가 있습니다. 여기서 y1은 시작점이고 y2는 각 영역의 끝점입니다.

좌표계의 원점은 왼쪽 위 모서리이므로 y2는 항상 y1보다 큽니다.

이것은 예입니다 -

const regions = [
   [10, 100],
   [50, 120],
   [60, 180],
   [140, 220]
];

우리는 하나의 영역 배열을 첫 번째 인수로, 숫자를 두 번째 인수로 취하는 JavaScript 함수를 작성해야 합니다.

특정 크기(함수의 두 번째 인수로 지정됨)보다 큰 모든 분리된 교차점을 찾고 싶습니다.

예를 들어 20단위라고 가정해 보겠습니다.

그러면 위 배열의 출력은 다음과 같아야 합니다. -

const output = [
   [60, 100],
   [140, 180]
];

단순화된 알고리즘을 사용하고 제품 전체에서 중복 항목을 검색하는 데 사용할 수 있습니다.

그런 다음 알 수 없는 일치 항목만 반복하고 필터링하여 공통 부분을 가져옵니다.

이에 대한 코드는 -

const regions = [
   [10, 100],
   [50, 120],
   [60, 180],
   [140, 220]
];
const getIntersections = (arr,num) => {
   let disjoint, res;
   return arr.reduce((acc,val,ind,array) => {
      if (val.used){
         return acc;
      };
      res = array.map((el, index) => array[(ind + index) % array.length]) .reduce((s,e) => {
         disjoint = [Math.max(s[0],e[0]), Math.min(s[1],e[1])];
         return disjoint[0] < disjoint[1] ? (e.used = true, disjoint) : s;
      });
      res[1] - res[0] > num && acc.push(res);
      return acc;
   },[]);
}
console.log(getIntersections(regions, 20));

출력

콘솔의 출력은 -

[ [ 60, 100 ], [ 140, 180 ] ]