2011-10-11 4 views
0

작업 코드를 작성 : http://jsfiddle.net/sXbRK/자바 스크립트 : 새로운 배열을 동적으로

내가 여러 선분을 가지고 있으며 각각 고유의 ID가 있습니다. 나는 서로 어떤 것이 교차하는지 압니다.

이제 중복되는 선분의 ​​ID를 새로운 배열로 푸시해야합니다.

서로 교차하지 않는 선분은 상관하지 않습니다.

서로 교차하는 선 세그먼트 ID를 자체 배열로 푸시하려면 어떻게해야합니까?

// New arrays of overlapping IDs 
e.g. Array A = [1,2,3]; 
    Array B = [7,8,12]; 
    Array C = [14,15]; 

는 여기에 지금까지 가지고 jsFiddle에 작업 진행 코드를 확인하는 것을 잊지 마세요 내용은 다음과 같습니다

function cross(ls) 
{ 
    var len = ls.length; 

    for(var a=0; a < len - 1; a++) 
    { 
     for(var b=a+1; b < len; b++) 
     { 
      var A = ls[a], 
       B = ls[b], 
       combine = [], 
       overlappers = []; 

      if 
      (
       (A.start <= B.start && (A.start + A.end) >= B.start) 
       || 
       (A.start <= A.start && (B.start + B.end) >= A.start) 
      ) 
      { 
       // Add overlapping elements to arrays 
       overlappers.push(A.id,B.id); 

       // Create arrays for line segments that overlap each other 
       combine[a] = new Array(overlappers); 
       document.write('Array' + [a] + ' ==> ' + combine[a] + '<br />'); 
      } 
     } 
    } 
} 


// Test data 
var lineSegments = [ 
    {id:'1', start:0, end:50}, 
    {id:'2', start:0, end:50}, 
    {id:'3', start:0, end:50}, 
    {id:'4', start:100, end:50}, 
    {id:'5', start:200, end:50}, 
    {id:'6', start:300, end:50}, 
    {id:'7', start:900, end:50}, 
    {id:'8', start:900, end:50}, 
    {id:'9', start:600, end:50}, 
    {id:'10', start:700, end:50}, 
    {id:'11', start:800, end:50}, 
    {id:'12', start:900, end:50}, 
    {id:'13', start:1000, end:50}, 
    {id:'14', start:1100, end:50}, 
    {id:'15', start:1100, end:50} 
]; 

// Execute function 
cross(lineSegments); 

몇 가지 아이디어를 도와주세요. 고맙습니다!

+0

나는 당신의 질문은 여기에 무엇 슈어 있지 않다. 어떤 선이 교차하는지 확인하거나 도움이 필요합니까? 배열에 무엇을 갖고 싶니? – suknic

+0

겹치는 선분의 ​​ID를 아주 새로운 배열로 푸시하고 싶습니다. 새로운 배열은 서로 겹치는 선분의 ​​ID 만 포함합니다 – JsusSalv

+0

'if (/ * line segments overlap * /) { // 새 배열 만들기, 오버랩 자 추가 combine [a] = new Array (overlappers) ; } ... 이런 식으로 – JsusSalv

답변

1

시도 :

var lineSegments = [ 
    {id:'1', start:0, end:50}, 
    {id:'2', start:0, end:50}, 
    {id:'3', start:0, end:50}, 
    {id:'4', start:100, end:50}, 
    {id:'5', start:200, end:50}, 
    {id:'6', start:300, end:50}, 
    {id:'7', start:900, end:50}, 
    {id:'8', start:900, end:50}, 
    {id:'9', start:600, end:50}, 
    {id:'10', start:700, end:50}, 
    {id:'11', start:800, end:50}, 
    {id:'12', start:900, end:50}, 
    {id:'13', start:1000, end:50}, 
    {id:'14', start:1100, end:50}, 
    {id:'15', start:1100, end:50} 
]; 


function fixSense(line) { 
    if (line.start > line.end) { 
    var t = line.start; 
    line.start = line.end; 
    line.end = t; 
    } 
    return line; 
} 

function getCrossingLines(lines) { 
    var a, b; 
    var overlappers = [], combined = []; 

    // for each line 
    for (var i=0, iLen=lines.length - 1; i<iLen; i++) { 
    a = fixSense(lines[i]); 

    // for every other line 
    for (var j=i+1, jLen=lines.length; j<jLen; j++) { 
     b = fixSense(lines[j]); 

     if ( (a.start <= b.start && a.end >= b.end) || 
      (a.start <= b.start && a.end >= b.end) || 
      (a.start <= b.end && a.end >= b.end)) { 
     overlappers.push(a.id, b.id); 
     combined.push([a.id, b.id]); 
     } 
    } 
    } 

    console.log('combined: ' + combined); 

} 

getCrossingLines(lineSegments); 
+0

이렇게 : http://jsfiddle.net/sXbRK/2/ ?? 한 줄로 모든 것을 뱉어냅니다. 아니면 뭔가 잘못 복사 했습니까? – JsusSalv

+0

아, 모든 오버 랩퍼가 결합되어 있지만 자체 배열에는 표시되지 않습니다. 좋아, 차갑다. 단. 감사. – JsusSalv

+0

두 개의 배열을 만듭니다. 하나는 ID 목록 만있는 배열이고 다른 하나는 배열에있는 각 쌍입니다. * combined * 배열에 경고하는 것은 모든 것을 쉼표로 구분 된 값으로 표시하지만 실제로는 2 개의 구성원 배열의 배열입니다. – RobG

관련 문제