Javascript 如何比较两条不同路径的点(点阵列)

Javascript 如何比较两条不同路径的点(点阵列),javascript,arrays,Javascript,Arrays,我必须比较两条不同路径的点,看看它们是否相似 我的问题是,这两条路都有不同的起点。这些路径也不是简单的矩形,因此我不认为可以根据最小的x和y值对数组重新排序 我试过这个: function orderPoints(points) { var smallestX; var smallestY; var smallestIndex; for (var i = 0; i < points.length; i++) { if (!smallestX) {

我必须比较两条不同路径的点,看看它们是否相似

我的问题是,这两条路都有不同的起点。这些路径也不是简单的矩形,因此我不认为可以根据最小的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;
}
函数顺序点(点){
小变种;
小变种;
var smallestIndex;
对于(var i=0;i
这似乎不起作用。我知道这两条路径非常相似,应该只有很小的差异。但是我得到的差异看起来不正确,所以我认为两个点阵列的“起点”都是错误的。有什么想法吗


下面是一个JSFIDLE,其中包含我当前的代码:

只是一个示例,可以比较相同路径和不同起点

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

这只是一个例子,可以比较不同起点的相同路径

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

考虑到你最近的评论,我认为这是你需要的:

var路径1=[
{“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}
];
变量路径2=[
{“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}
];
功能路径差异(p1、p2){
//如果路径长度不同,则提前中止
如果(p1.长度!=p2.长度){
返回false;
}
//对每个路径中的点进行排序
[p1,p2].forEach(函数(p){
p、 排序(功能(a、b){
返回a.xlog(路径差异(路径1,路径2))考虑到您最近的评论,我认为这就是您需要的:

var路径1=[
{“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}
];
变量路径2=[
{“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}
];
功能路径差异(p1、p2){
//如果路径长度不同,则提前中止
如果(p1.长度!=p2.长度){
返回false;
}
//对每个路径中的点进行排序
[p1,p2].forEach(函数(p){
p、 排序(功能(a、b){
返回a.xlog(路径差异(路径1,路径2))通过从路径中的所有点减去路径的第一个点,可以尝试重新计算两条路径,就像它们从0,0开始一样。如果两条路径的形状完全相同,那么它们的JSON.stringify版本应该是相同的。@Shilly您是否能够提供一个示例,因为我看不出这是如何工作的,因为两条路径的起点不同请更精确地定义“相似的路径”。是否要测试路径#2是否是路径#1的精确转换?或者你想计算某种相似性分数?你想比较形态和大小吗?我的意思是,你想看看它们是完全相同的路径,还是只是具有相同设计但与大小和旋转无关的路径?我会尝试制作一个模型,给我几分钟时间。但正如阿尔诺所说,这项技术只适用于完全相同的路径,但你可以进一步扩展它以计算难度百分比,但这需要更多的代码。你可以尝试重新计算两条路径,就像它们从0,0开始一样,从路径中的所有点减去路径的第一点。如果两条路径的形状完全相同,那么它们的JSON.stringify版本应该是相同的。@Shilly您是否能够提供一个示例,因为我看不出这是如何工作的,因为两条路径的起点不同请更精确地定义“相似的路径”。是否要测试路径#2是否是路径#1的精确转换?或者你想计算某种相似性分数?你想比较形态和大小吗?我的意思是,你想看看它们是完全相同的路径,还是只是具有相同设计但与大小和旋转无关的路径?我会尝试制作一个模型,给我几分钟时间。但正如阿尔诺所说,这种技术只适用于完全相同的路径,但你可以进一步扩展它,以计算难度百分比,但这需要更多的代码。抱歉,我想我解释错了。我想你的代码会检查它是否是同一个形状,我需要它看看它是否在同一个位置呃,你是什么意思?位置是它在xy网格上的位置编号?两个爸爸