Отфильтровать много координат X | Y от 2 входов по расстоянию - PullRequest
0 голосов
/ 10 декабря 2018

Я хочу отфильтровать многие координаты по расстояниям, но я не могу рассчитать каждый элемент двухмерной таблицы с другим.Я сделал изменение формата из текста в двухмерный массив, где каждый элемент является координатой, которая имеет X и Y. Не могу объяснить все это, но у меня есть проект скрипки, где он четко показан.

Результат, что я хочучтобы получить список координат из textfield1, чьи расстояния не превышают 5 для каждой координаты из textfield2

Пожалуйста, проверьте: 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>

>>> ИЗОБРАЖЕНИЕ, КАК ЭТО СМОТРЕТЬ <<< </a>

Мне нужно это для школьного проекта и хочу учитьсяна будущее, так что комментарии между кодом будут потрясающими!

1 Ответ

0 голосов
/ 10 декабря 2018

Я не уверен, что вам нужен список координат из textfield1, для которых их расстояния не выше 5 для ВСЕХ координат из textfield2, или просто любые координаты из текстового поля 2. В любом случае код очень похож.

Вы хотите отфильтровать значения, не соответствующие некоторым критериям, поэтому мы начнем с метода filter

coords1_intoXY.filter()

Итак, каковы критерии?Я предполагаю, что расстояние должно быть меньше 5 для всех чисел в текстовом поле 2, поэтому нам понадобится every

coords1_intoXY.filter(coords1 => 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('|'));
...