В «вселенной операций перемещения» есть четыре возможности:
target source
is is left
----------------------------------------------------------
constructed <-- constructed // C++11 -- move construction
constructed <-- destructed
assigned <-- constructed // C++11 -- move assignment
assigned <-- destructed
Каждая из этих операций полезна ! std::vector
один может использовать первые три. Хотя обратите внимание:
X x1, x2;
if (sometimes)
{
x1 = std::move(x2);
}
// Is x2 moved-from here?
2-й и 4-й могут быть эмулированным 1-м и 3-м соответственно, просто вручную вызывая деструктор на источнике после операции.
1-й и 3-й имеют решающее значение. Алгоритмы типа std::swap
и std::sort
регулярно нуждаются в обеих этих операциях. Этим алгоритмам не нужно разрушать ни один из их входных объектов & mdash; только меняйте их значения.
Вооружившись этими знаниями, в период 2001-2002 гг. Я сосредоточил свои усилия на двух операциях, которые оставили свой исходный код созданным, потому что эти две операции оказали бы наибольшее (положительное) влияние на то, что тогда было C ++. 98. В то время я знал, что если я не сверну амбиции этого проекта, то он никогда не будет успешным. Даже ограниченный, он был слишком амбициозным, чтобы добиться успеха.
Это сокращение признано в первоначальном предложении семантики перемещения в разделе, озаглавленном «Семантика разрушительного движения».
В конце концов, мы просто отказались от этого как от слишком большой боли для недостаточной выгоды. Однако текущее предложение не запрещает семантику разрушительного перемещения в будущем. Это можно сделать в дополнение к семантике неразрушающего движения, описанной в этом предложении, если кто-то захочет нести этот факел.
Подробнее о том, что можно делать с перемещенным объектом, см. https://stackoverflow.com/a/7028318/576911
.
Ваши данные выглядят как двухмерный параметрический график (x, y)
как функция некоторого базового параметра t
. Таким образом, можно выполнить аппроксимацию методом наименьших квадратов x (t)
и y (t)
, если вы сможете найти разумное модель для них. Похоже, что ваши данные описывают лимакон .
Редактировать: nvm неверно истолковал вопрос. В любом случае я оставлю этот ответ здесь.
Может быть, попробуйте сначала найти выпуклую оболочку точек, а затем подогнать выпуклую оболочку на плоскости
http://www.cse.unsw.edu .au / ~ lambert / java / 3d / giftwrap.html <- включает java-анимацию реализации http://en.wikipedia.org/wiki/Convex_hull_algorithms
Если вам не нужна эффективность, есть несколько очень простых реализаций, например версия подарочной упаковки, которая равна O (n ^ 2) http://en.wikipedia.org/wiki/Gift_wrapping_algorithm
Версия «разделяй и властвуй» - O (nlogn)
Вам нужно будет выполнить несколько кусочков или шлицев. Не ожидайте, что какой-либо алгоритм сможет сделать все за один раз. Может быть как минимум три дуги: первая до перекрестка, петля, а затем назад от перекрестка вперед.
Эта проблема действительно сложна, если у вас нет заказа. Выполнить метод наименьших квадратов для некоторого (x (t), y (t)) легко - если вы знаете порядок t .
Возможно, вам понадобится что-то своего рода алгоритм поиска. Генетический алгоритм может подойти.
you could try to infer the ordering of the points, then apply the spline procedures. there is an ambiguity where the curve crosses itself, of course.
perhaps the most naive approach would be to compute the Delaunay Triangulation (nlogn time), from which approximate a Euclidian Minimum Distance Hamiltonian Cycle through the points. You would still have to figure out where the 'ends' are. From the ordering you could then apply the spline techniques. For a reference, see Finding Hamiltonian Cycles in Delaunay Triangulations Is NP-Complete, or Reinelt's paper on TSP heuristics, 1992, or EMST at Wikipedia
hth,