SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Convex Shapes.Как сделать невыпуклые многоугольники › Ответ в теме: Convex Shapes.Как сделать невыпуклые многоугольники
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
/*Сразу извиняюсь за нечитаемый код, набросал по-быстрому, главное идея. Можно например сгенерировать случайные координаты точек, например для k вершин, хотя k это много, возьмём n. Далее перейти в полярную систему координат и посчитать угол и радиус для каждой точки. Проведем сортировку по углу и в зависимости от него найти координаты точек. Соединим их по возрастанию угла. По сути отсортируем координаты точек по углу и соединим их.*/ int main() { { int n = 6;//число вершин ConvexShape Mnogoygolnik; Mnogoygolnik.setPointCount(n);//вершины Mnogoygolnik.setOutlineThickness(1);//толщина обводки Mnogoygolnik.setOutlineColor(Color::Red);//цвет обводки float x = rand() % 150 - 75;//х float y = rand() % 150 - 75;//у float fi = 0;//угол float r = sqrt(pow(x, 2) + pow(y, 2));//радиус float fiArr[n];//массивы для сортировок float xArr[n]; float yArr[n]; float rArr[n]; float tmp, tmpr;//временные переменные для сортировки for (int i = 0; i < n - 1; i++) { x = rand() % 150 - 75; y = rand() % 150 - 75; r = sqrt(pow(x, 2) + pow(y, 2)); //atan() возвращает значения в радианах, попутно переведем их в градусы if (x > 0 && y >= 0)//считаем угол в зависимости от положения точек fi = atan(y / x) * 180 / PI; if (x > 0 && y < 0) fi = atan(y / x) * 180 / PI + 360; if (x < 0) fi = atan(y / x) * 180 / PI + 180; if (x == 0 && y > 0) fi = 90; if (x == 0 && y < 0) fi = 270; if (x == 0 && y == 0) fi = rand() % 360; fiArr[i] = fi;//записываем сгенерированные углы в массив rArr[i] = r;//аналогично с радиусом } for (int i = 0; i < n - 2; ++i)//пузырьковая сортировка { for (int j = 0; j < n - 2; ++j) { if (fiArr[j + 1] < fiArr[j]) { tmp = fiArr[j + 1]; fiArr[j + 1] = fiArr[j]; fiArr[j] = tmp; tmpr = rArr[j + 1]; rArr[j + 1] = rArr[j]; rArr[j] = tmpr; } } } for (int i = 0; i < n - 1; i++)//пересчитываем координаты для углов, но уже в правильном порядке { xArr[i] = rArr[i] * cos(fiArr[i] * PI / 180); yArr[i] = rArr[i] * sin(fiArr[i] * PI / 180); Mnogoygolnik.setPoint(i, Vector2f(xArr[i], yArr[i])); } window.clear(); window.draw(Mnogoygolnik);//вывод фигуры window.display(); } return 0; } |