2015-10-23 4 views
2

Учитывая У меня есть массив пропорций (3 значения, которые в общей продукции 100%):Найти ближайшие Пропорции алгоритм

var proportions = [[10,10,80],[20,30,50],[40,20,40],[0,0,100]];

Как отсортировать массив в порядке близости (расстояние) к любому одна заданная пропорция?

Например, sortProportions(proportions, [22,28,50]) вернет [[20,30,50],[10,10,80],[40,20,40],[0,0,100]].

Здесь [20,30,50] является первым, поскольку он является наиболее близким к [22,28,50]. Однако не уверен в другом.

В математическом термине это называется тернарный участок. Проблема сводится к обнаружению расстояния между двумя точками на тройном участке.

+0

don't действительно понимают, что близость будет, не могли бы вы привести пример пропорции и ожидаемых результатов? – juvian

ответ

1

Предполагая, что вы имеете в виду сумму квадратов разностей для каждого измерения близости

function distance2(p1, p2) { 
    return Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2) + Math.pow(p1[2] - p2[2], 2) 
} 

// given point 
var gP = [20, 30, 55]; 

// sort 
var output = [[10, 10, 80], [20, 30, 50], [40, 20, 40], [0, 0, 100]].sort(function (a, b) { 
    // -1 if a before b 
    // 1 if a after b 
    // 0 if no change 
    return Math.sign(distance2(a, gP) - distance2(b, gP)); 
}); 
+0

Нужны ли нам квадраты? Это не точки в 3-мерном пространстве – Dziamid

+0

А! Я помещал это перед вашим редактированием, добавляя более подробную информацию :-). Но anyhoo, все, что вам нужно сделать, это изменить функцию distance2. Сначала переведите каждую точку в декартовую (см. Https://en.wikipedia.org/wiki/Ternary_plot> Построение тройного графика> последней формулы), чтобы получить (x, y) для каждого [a, b, c]. А затем (x1 - x2)^2 + (y1 - y2)^2 – potatopeelings

Смежные вопросы