Я пытаюсь создать веб-приложение Javascript, где пользователь нажимает на холст, чтобы удалить бесконечное количество точек. Существует кнопка разрешения, которая при нажатии рисует линии между точками, так что все точки соединяются ровно двумя другими точками, и никакие строки не пересекаются. С моим кодом до сих пор есть определенные случаи, когда линии все еще пересекаются, и я не могу программно вычислить логику, которая будет соединять все точки без каких-либо линий, когда-либо пересекающихся.Подключение точек без пересекающихся линий
До сих пор я собирал все точки (координаты X-Y) и помещал их в массив объектов JavaScript. Затем мне нужно отсортировать массив так, чтобы он был в правильном порядке. Все работает в этот момент, за исключением того, что заказ не всегда удовлетворяет требованиям.
Мой вопрос: Есть ли у кого-нибудь идеи по набору правил, которые будут упорядочивать эти точки (координаты X-Y), чтобы все они соединялись, но никогда не пересекались, что будет работать в каждом сценарии?
Благодарим за помощь.
var centroid = get_polygon_centroid($points);
$points = _.sortBy($points, function(p){
var dx = p.coords.x-centroid.x;
var dy = p.coords.y-centroid.y;
return dx*dx + dy*dy;
});
$points = _.sortBy($points, function(p){
var dx = p.coords.x-centroid.x;
var dy = p.coords.y-centroid.y;
return Math.atan2(dy, dx);
});
$points.push($points[0]);
добавленный образец кода. – Jason
Разве этот алгоритм? можете ли вы отметить центр масс, который вы нашли? Вчера я сделал умственное доказательство правильности, и это должно быть правильно, но скриншот, который вы опубликовали, не выглядит так, как следовало моему алгоритму. – Jason
Обновлен код, соответствующий вашему. Теперь все должно работать. Я думаю, что у вас проблемы с вычислением центроида. Я продолжал получать NaN, используя вашу функцию. – Jason