2016-08-09 3 views
0

두 경로가 서로 다른 점을 비교해야합니다.두 개의 서로 다른 경로의 점을 비교하는 방법 (점의 배열)

내 문제는 두 경로의 시작점이 다릅니다. 이 경로는 단순한 직사각형이 아니므로 가장 작은 x 및 y 값을 기반으로 배열을 재정렬 할 수 있다고 생각하지 않습니다.

나는 이것을 시도 :

function orderPoints(points) { 
    var smallestX; 
    var smallestY; 
    var smallestIndex; 

    for (var i = 0; i < points.length; i++) { 
    if (!smallestX) { 
     smallestX = points[i].x; 
     smallestIndex = i; 
     smallestY = points[i].y; 
    } else { 
     if (points[i].x < smallestX && points[i].y < smallestY) { 
     smallestX = points[i].x; 
     smallestY = points[i].y; 
     smallestIndex = i; 
     } 
    } 
    } 

    //reorder array 
    var newArray = []; 
    for (var i = smallestIndex; i < points.length; i++) { 
    newArray.push(points[i]) 
    } 

    for (var i = 0; i < smallestIndex; i++) { 
    newArray.push(points[i]) 
    } 
    //console.log(newArray) 
    return newArray; 
} 

이 작동하지 않습니다. 나는이 두 경로가 매우 유사하다는 것을 알고 아주 작은 차이로 끝나야 만합니다. 그러나 내가 얻은 차이는 틀린 것처럼 보입니다. 그래서 두 지점 배열의 '출발점'이 잘못되었다고 생각합니다. 어떤 아이디어? https://jsfiddle.net/thatOneGuy/5b3646zj/

+0

두 경로는 경로의 모든 점에서 경로의 첫 번째 점을 빼서 0,0에서 시작한 것입니다. 그런 다음 두 경로의 JSON.stringify 버전이 동일한 모양 인 경우 동일한 경로 여야합니다. – Shilly

+0

@Shilly 두 경로의 시작점이 다르므로 어떻게 작동하는지 볼 수 없으므로 예제를 제공 할 수 있습니까? – thatOneGuy

+1

'유사한 경로'를보다 정확하게 정의하십시오. 경로 # 2가 경로 # 1의 정확한 번역인지 테스트 하시겠습니까? 아니면 어떤 종류의 유사성 점수를 계산하고 싶습니까? – Arnauld

답변

2

계정으로 최신 의견을 촬영, 나는 이것이 당신이 필요 생각 :

var path1 = [ 
 
    { "x": 1.0265, "y": 2.4715 }, { "x": 5.4865, "y": 2.4715 }, 
 
    { "x": 5.5615, "y": 2.3965 }, { "x": 5.5615, "y": 0.2965 }, 
 
    { "x": 5.4865, "y": 0.2215 }, { "x": 1.0265, "y": 0.2215 }, 
 
    { "x": 0.9515, "y": 0.2965 }, { "x": 0.9515, "y": 2.3965 } 
 
]; 
 
var path2 = [ 
 
    { "x": 5.5615, "y": 0.2965 }, { "x": 5.5615, "y": 2.3965 }, 
 
    { "x": 5.4865, "y": 2.4715 }, { "x": 1.0265, "y": 2.4715 }, 
 
    { "x": 0.9515, "y": 2.3965 }, { "x": 0.9515, "y": 0.2965 }, 
 
    { "x": 1.0265, "y": 0.2215 }, { "x": 5.4865, "y": 0.2215 } 
 
]; 
 

 
function pathDifference(p1, p2) { 
 
    // abort early if the paths have different lengths 
 
    if(p1.length != p2.length) { 
 
    return false; 
 
    } 
 

 
    // sort points in each path 
 
    [ p1, p2 ].forEach(function(p) { 
 
    p.sort(function(a, b) { 
 
     return a.x < b.x || (a.x == b.x && a.y < b.y) ? -1 : 1; 
 
    }); 
 
    }); 
 

 
    // build array of {dx, dy} differences between the 2 paths 
 
    return p1.map(function(p, i) { 
 
    return { dx: p2[i].x - p.x, dy: p2[i].y - p.y }; 
 
    }); 
 
} 
 

 
console.log(pathDifference(path1, path2));

메모를 정렬에 대해

당신은 할 수 없습니다 X 만 비교 (또는 Y 만)하여 포인트를 정렬하십시오. 다음 예제를 고려해 보겠습니다 :

P0 = (7, 9), P1 = (12, 3), P2 = (7, 5) 

X 좌표를 비교하면 P1이 'P0 및 P2'다음에 있음을 명확하게 알 수 있습니다. 그러나 두 좌표가 동일 할 때 두 번째 결정적 정렬 규칙이 필요하므로 P2가 P0 전후인지 여부를 결정할 수 있습니다. 예를 들어

: 2 기준없이

if X0 < X1 then P0 is before P1 
if X0 > X1 then P0 is after P1 
if X0 == X1 AND Y0 < Y1 then P0 is before P1 
if X0 == X1 AND Y0 > Y1 then P0 is after P1 

, 무작위 같은 X 좌표가 모든 점을 주문할 것 .sort() 방법.

(비교 X 제 Y 두 번째는 두 경로에 대해 동일한 방법을 사용하고있는만큼, 단지 잘 작동 주위를 다른 방법으로 수행. 단지 대회입니다.) 당신은 다시 계산을 시도 할 수

+0

이것은 멋지지만 종류에 약간의 문제가 있다고 생각합니다. 내 피들 및 orderPoints 함수를 살펴 보겠습니다. 나는 smallestX 값의 인덱스를 얻고이를 사용하여 경로 배열을 '다시 빌드'합니다. 희망이 내가 잘 설명해, 배열 1,2,3,4,5 및 인덱스 3 내가 시작하고 싶은 지점입니다, 그래서 배열을 재정렬합니다. 그래서 3,4,5,1,2처럼 경로를 올바르게 그리려면 동일한 순서를 유지해야합니다. 말이 돼 ? 당신이 여기에 콘솔 로그를 보면 : https://jsfiddle.net/thatOneGuy/b97tvxc1/ 마지막 두 점을 바꿀 필요가있다. (나는 생각한다) – thatOneGuy

+0

@thatOneGuy 방금 내 대답에 그 종류에 관한 메모를 추가했다. . 그 말이 맞는다면 알려주십시오. – Arnauld

+0

그게 합리적이라고 생각합니다. 주문이 동일하다는 말씀입니까? (예 : 다른 출발점이지만 순서는 동일합니다.) 내가 이해할 수없는 것처럼 그 케이스가 동일하게 유지되는 경우 – thatOneGuy

2

하나 다른 시작 지점과 동일한 경로를 비교할 수있는 방법을 그냥 예 :

여기에 내 현재 코드와 JSFiddle입니다.

var path1 = [ 
     {'x' : 5, 'y' : 10}, 
     {'x' : 3, 'y' : 8}, 
     {'x' : 9, 'y' : 14}, 
     {'x' : 7, 'y' : 25} 
    ], 
    path2 = [ 
     {'x' : 11, 'y' : 16}, 
     {'x' : 9, 'y' : 14}, 
     {'x' : 15, 'y' : 20}, 
     {'x' : 13, 'y' : 31}   
    ], 
    normalize = function normalize(path) { 
     var centerX = path[0].x, 
      centerY = path[0].y; 
     return path.map(function(point) { 
      point.x -= centerX; 
      point.y -= centerY; 
      return point; 
     }); 
    }, 
    normalizedPath1 = normalize(path1), // [{"x":0,"y":0},{"x":-2,"y":-2},{"x":4,"y":4},{"x":2,"y":15}] 
    normalizedPath2 = normalize(path2); // [{"x":0,"y":0},{"x":-2,"y":-2},{"x":4,"y":4},{"x":2,"y":15}] 
console.log(JSON.stringify(normalizedPath1) === JSON.stringify(normalizedPath2)); // true 
+0

사과, 나는 이것을 잘못 설명했다고 생각합니다. 나는 당신의 코드 체크가 같은 모양인지, 그것이 같은 위치에 있는지보기 위해서 필요하다고 생각한다. – thatOneGuy

+0

어, 무슨 뜻이야? 위치는 xy 표에 위치합니까? 두 개의 경로는 모든 점이 동일하고 동일한 모양 인 경우 동일한 위치 만 갖습니다. 이것은 실제로 그들이 xy 격자의 동일한 사분면에있는 한 시작하는 위치와 동일한 모양을 가지고 있는지 확인합니다. (미러 된 경로는 확인하지 않습니다.) – Shilly

+0

그렇지만 코드의 데이터가 순서대로 있습니다. 즉 path1의 첫 번째 요소는 path2의 첫 번째 요소에 해당합니다. 내 것은 정렬되지 않았고 필요한 것은 경로 1의 x와 y 좌표가 경로 2의 어느 좌표인지 확인하는 방법입니다. 그래서 나는 점에서 다른 것을 확인할 수 있습니다 – thatOneGuy

관련 문제