Звучит так, как будто вы, вероятно, ищете «Простой» (в отличие от «Сложного») полигон:
http://en.wikipedia.org/wiki/Simple_polygon
Не обязательно есть уникальное решение для этого:
Сортировка списка точек в многоугольник
Вот почему упорядочение точек или сегментов пути обычно имеет значение в механизмах рисования многоугольников. Если вы склонны - однако - вы можете найти хотя бы один некомплексный многоугольник для набора точек:
http://www.computational -geometry.org / списки рассылки / compgeom-анонс / 2003-март / 000727.html
http://www.computational -geometry.org / списки рассылки / compgeom-анонс / 2003-март / 000732.html
Другие отметили, что ваш код повторяется, как написано. Вы также не определяете k
в отрывке, которым вы поделились, и лучше использовать термин множественного числа для вектора объектов («вершин»), а не один, предполагающий, что он является единственным («вершина»). Вот один довольно простой для понимания набор изменений, который следует обобщить на любое количество вершин:
void draw_picture(Canvas & canvas, int k, int numVertices = 5) {
vector<PairXY> vertices;
for (int index = 0; index < numVertices; index++) {
vertices.push_back(PairXY(drandom(k),drandom(k)));
}
vector<PairXY>::const_iterator iter = vertices.begin();
while (iter != vertices.end()) {
PairXY startPoint = *iter;
iter++;
if (iter == vertices.end()) {
Line edgeLine (startPoint, vertices[0]);
draw_line(edgeLine, canvas);
} else {
Line edgeLine (startPoint, *iter);
draw_line(edgeLine, canvas);
}
}
}
Существует множество способов управления итерациями в C ++, хотя многие из них более многословны, чем их аналоги в других языках. Недавно в C ++ 11 был добавлен loop с диапазоном *1031*, но ваша среда сборки может его еще не поддерживать.