В моем программном обеспечении я получаю точки 2D-контура, хранящиеся в векторе matrix
Моя задача теперь состоит в том, чтобы отсортировать эти точки, чтобы получить контур. Сначала я попробовал функцию atan2
, ведьма работала хорошо для обычных случаев. Но в случае для невыпуклого контура это не работает. Итак, после поиска в google и после некоторых ответов здесь я попытаюсь рассчитать ближайшие точки. Таким образом, у меня есть функция, которая вычисляет расстояние между двумя точками.Точки сортировки в соответствии с их координатами
double distancepoints(vector<double> const& s1, vector<double> const& s2)
{
return sqrt((s1[0] - s2[0])*(s1[0] - s2[0]) + (s1[1] - s2[1])*(s1[1] - s2[1]));
}
Чтобы найти ближайший пункт я бы определить в функции индекса точки, которая находится ближе всего к заранее определенной начальной точки.
int closestpoint(vector<double> const& p, begin, end)
{
double d=0;
result = begin;
while(begin != end)
{
double d2 = distancepoints(p, begin);
if(d2 < d)
{
d = d2;
result = begin;
}
}
return result;
}
Здесь я не знаю, как передать начало и конец вектора.
Если у меня есть указатель на следующую точку, я бы сохранил эту точку в векторе Hull
и удалил ее из вектора matrix
. Это должно произойти до тех пор, пока matrix
не будет полностью стерта.
vector<vector<double> > matrix;
vector<vector<double> > hull;
int columns = 3;
const std::vector<LineSegment> &lss = slicesWithLineSegments[i];
rows = 2*lss.size();
matrix.resize(rows);
for(size_t i=0; i<matrix.size(); i++) {
matrix[i].resize(columns);
}
for(size_t i=0; i<hull.size(); i++) {
hull[i].resize(columns);
}
vector<vector<double> > startpoint;
for(size_t i=0; i<startpoint.size(); i++) {
startpoint[i].resize(columns);
}
startpoint[0][0]=matrix[0][0];
startpoint[0][1]=matrix[0][1];
startpoint[0][2]=matrix[0][2];
matrix.erase(matrix.begin());
while (matrix.size())
{
// Find next point (the one closest to p) and return index
int it = closestpoint(startpoint, matrix.begin(), matrix.end());
// Store nearest point
hull.push_back(std::vector<double>(3, 0));
r = hull.size()-1;
hull[r][0] = matrix[it][0];
hull[r][1] = matrix[it][1];
hull[r][2] = matrix[it][2];
// Our new p is the point we just found
startpoint = matrix[it];
// Remove the point we just found from the vector of points
matrix.erase(matrix[it]);
}
Но почему-то мне удается не просто запрограммировать функцию. Может, у кого-то есть идея, что я делаю неправильно?
Я предполагаю 'matrix.erase (it)' вместо 'matrix.erase (matrix [it])' – max66
@ max66: Спасибо за подсказку. Но моя главная проблема заключается в функции «ближайшая точка». Здесь я не знаю, как я могу заставить эту функцию работать, поэтому она возвращает индекс ближайшей точки к исходной точке. – user3794592
Данные 'vector> it; для (size_t i = 0; i