SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Convex Shapes.Как сделать невыпуклые многоугольники
В этой теме 7 ответов, 3 участника, последнее обновление xtronix 2 года/лет, 2 мес. назад.
-
АвторСообщения
-
Есть у кого нибудь нормальный алгоритм или идеи по рисованию невыпуклых полигональных многоугольников, или обязательно разбивать его на несколько многоугольников?
http://www.sfml-dev.org/tutorials/2.0/graphics-shape.php Ссылка на тему в документации
Иначе получается то что на скринахВложения:
You must be logged in to view attached files.Так вот же пример рисования многоугольников.
А выпуклый, или не выпуклый зависит лишь от координат точек.
Как правило, последняя точка (4) присоединится к первой (0)C++123456789101112// create an empty shapesf::ConvexShape convex;// Указываем что полигон состоит из 5 точекconvex.setPointCount(5);// Указываем координаты каждой точки (x,y)convex.setPoint(0, sf::Vector2f(0, 0));convex.setPoint(1, sf::Vector2f(150, 10));convex.setPoint(2, sf::Vector2f(120, 90));convex.setPoint(3, sf::Vector2f(30, 100));convex.setPoint(4, sf::Vector2f(0, 50));Я же привел пример что происходит при таком методе рисования,выше в скринах
что должно быть и что получаетсяПокажите нам код.
На изображении я вижу 11 точек, у тебя их 8. Это говорит о том что нужно добавить точки и указать нужные координаты для каждой.
Это навеяло мне идею. если будет время и желание, создам систему облегчающую задачу координирования для каждой точки.
Суть в том что у меня как раз 11 точек,а не 8
Вложения:
You must be logged in to view attached files.C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172/*Сразу извиняюсь за нечитаемый код, набросал по-быстрому, главное идея.Можно например сгенерировать случайные координаты точек, например для 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;}Вложения:
You must be logged in to view attached files. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.