【问题标题】:Filter many X|Y coordinates from 2 inputs by distance按距离从 2 个输入中过滤许多 X|Y 坐标
【发布时间】:2018-12-10 13:25:52
【问题描述】:

我想按距离过滤许多坐标,但我不能用另一个计算二维表的每个元素。我已经将格式从文本更改为二维数组,其中每个元素都是具有 X 和 Y 的坐标。 无法解释这一切,但我有明确显示的小提琴项目。

我想要得到的结果是来自 textfield1 的坐标列表,对于来自 textfield2 的每个坐标,它们的距离不高于 5

请查看:https://jsfiddle.net/Ashayas/9c7mjts4/

console.log("==== 1 ====");
//Get inputs
var coords1 = document.getElementById("coord1").value.split(" ");
var coords2 = document.getElementById("coord2").value.split(" ");
console.log(coords1);
console.log(coords2);

console.log("==== 2 ====");
//Make them X and Y
var coords1_intoXY = [];
for (var i = 0; i < coords1.length; i++) {
  coords1_intoXY[i] = coords1[i].split("|");
}
var coords2_intoXY = [];
for (var i = 0; i < coords2.length; i++) {
  coords2_intoXY[i] = coords2[i].split("|");
}
console.log(coords1_intoXY);
console.log(coords2_intoXY);

//Now combine all x|y and put into new array, after that sort and get result
//I dont know is that good thinking, maybe there is another way to achieve result
/*
var beforesort = [];
for (var i = 0; i < originalContent.length; i++) {
  paste7[i] = originalContent[i].join(" ").split(splitCharacter).filter(x => !unwantedContent.includes(x));
}
      function compare(coords1,coords2){
  const coords3 = [];
  
    let result;
  
  coords1.forEach((e1,i)=>coords2.forEach(e2=>{
    
         if(e1.length > 1 && e2.length){
            result = compare(e1,e2);
         }else if(e1 !== e2 ){
            result = false
         }else{
            result = true
         }
    })
  )
  
  return result
  
}
*/

x1 = 10
y1 = 10

x2 = 1
y2 = 1

example = Math.hypot(x2 - x1, y2 - y1)
console.log("Example = " + example);

function distance(x1, y1, x2, y2) {
  a = Math.abs(Number(x1 - x2));
  b = Math.abs(Number(y1 - y2));
  c = Math.sqrt((a * a) + (b * b));
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Program sort coordinates X|Y from inputs. Result is a list of coordinates from input1 which their distances between second input coords arent highter than the value from input 3 (for example "5")
<br>
<br> Two inputs for coordinates X|Y
<br>
<textarea id="coord1">3|1 5|5 10|10</textarea>
<textarea id="coord2">9|1 1|1</textarea>
<br> Sort by max distance
<br>
<input value="5" id="coord3">
<br>

<br>
<textarea id="result">Result</textarea>
<br>
<button id="show">Show</button>

<br>
<br> EXAMPLE:
<br>
<br> We have "3|1 5|5 10|10" inside coord1
<br> We have "9|1 1|1" inside coord2
<br>
<br> Program calculate distance between coords
<br> 3|1 and 9|1 = 6
<br> 3|1 and 1|1 = 2
<br> 5|5 and 9|1 = 5.65 ~ 6
<br> 5|5 and 1|1 = 5.65 ~ 6
<br> 10|10 and 9|1 = 9.05 ~ 9
<br> 10|10 and 1|1 = 12.72 ~ 13
<br>
<br> And the result should looks like this:
<br> 3|1
<br> Other coords are higter than 5 distance in any case so we skip them
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>

>>>IMAGE HOW IT LOOKS<<<

我在学校项目中需要它,并且想为将来学习,所以代码之间的 cmets 会很棒!

【问题讨论】:

    标签: javascript arrays filtering coordinates jsfiddle


    【解决方案1】:

    我不确定你是否想要一个来自 textfield1 的坐标列表,对于来自 textfield2 的所有坐标,它们的距离不高于 5,或者只是来自 textfield 2 的任何坐标。无论哪种方式,代码都非常相似。

    你想过滤掉不符合某些条件的值,所以我们从方法filter开始

    coords1_intoXY.filter()

    那么标准是什么?我假设与文本字段 2 上的所有数字的距离必须小于 5,所以我们需要every

    coords1_intoXY.filter(coords1 =&gt; coords2_intoXY.every())

    请注意,如果您想要在文本字段 2 中任何坐标范围内的坐标,只需将 every 替换为 some

    现在,正如奥利弗所说,我们计算距离。

    var coords1_intoXY = [["3", "1"], ["5", "5"], ["10", "10"]];
    var coords2_intoXY = [["9", "1"], ["1", "1"]];
    
    let answer = coords1_intoXY.filter(coords1 => coords2_intoXY.some(coords2 => {
      let x = Number(coords1[0]) - Number(coords2[0])
      let y = Number(coords1[1]) - Number(coords2[1])
      return Math.hypot(x, y) < 5
    }))
    
    console.log(...answer.map(coords => coords.join('|')));

    最后一部分,随意展示

    return answer.map(coords => coords.join('|'));
    

    【讨论】:

    • 有效!这就是我试图实现的目标。感谢 iagowp 和 Olivier!
    • 另一个问题。你知道一些处理大量坐标的方法吗?例如,当我想要排序 10000 和 50000 程序停止响应并在很长一段时间后给出结果(并非总是如此)。我试过用这个应用程序制作离线版的html,但问题还是一样。复制/粘贴坐标后程序似乎停止响应,计算后的结果只能从控制台日志中复制。是RAM的问题吗?我可以让这个程序以某种方式使用图形卡吗? (这不是项目的要求,但我很有趣)
    • 这需要很长时间,我的意思是,你的时间复杂度是 O(NxM)。我不知道如何使用图形卡或类似的东西。为了更有可能获得结果,您可以将第一个数组拆分为更小的数组,然后一次执行一次。
    • 我找到了解决方案。只需让程序在后台运行,另一个是网络工作者。就是这样 :P 最后一个问题。你知道如何在指定范围内按 coords2 的数量对 coords1 进行排序吗?首先用坐标做正常结果,然后按距离排序? (一般如何在 coords1 范围内添加计算 coords2 量的函数示例:i.imgur.com/PYzCJ8q.png)或者我应该尝试重写代码以像这样工作: 1. 计算每个坐标之间的距离。 2.删除大于“5” 3.按坐标排序数组 4.返回相同坐标的个数???
    • 您可能想写一个新问题,因为它与原来的问题有很大的不同。无论如何,我会在coords1_intoXY 上使用map,在那里我会在coords2_intoXY 上添加范围内的坐标数,然后过滤第三个值为0 的结果,然后使用排序方法进行排序.连接也需要更改为仅连接前 2 个值。
    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 2014-11-10
    相关资源
    最近更新 更多