Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25

Как можно нарисовать многоугольник

15.11.2016, 13:15. Показов 2547. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток.
Как можно нарисовать многоугольник на canvas, если есть размеры сторон углы в градусах и размеры диагоналей.
Какие есть идеи!?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.11.2016, 13:15
Ответы с готовыми решениями:

нарисовать многоугольник
Подскажите пожалуйста новичку! Как нарисовать многоугольник напрямую на canvas? Например 8 вершин: начинаем с точки(вершину) (А), потом...

Хочу нарисовать многоугольник с некоторыми координатами углов. Как?! можно и не правильный
Хочу нарисовать многоугольник с некоторыми координатами углов. Как?! можно и неправильный

Как нарисовать многоугольник?
Хочу нарисовать многоугольник с некоторыми координатами углов. Как?!

39
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
16.11.2016, 12:49
Студворк — интернет-сервис помощи студентам
serjekat, как приложение поймет в какую из вершин вы ведете диагональ? из какой - я думаю за это отвечает ввод хотя уже ничему не удивлюсь если будет сказано что программа "догадывается" сама. а вот в какую из вершин... ?
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 13:34  [ТС]
у каждой вершины есть номер и имя, пользователь нажимает к примеру на угол A затем нажимает на угол C выводится диалоговое окно где пользователь вводит размер диагонали.
Проблема не в том как ввести данные, а в том как поменять координаты углов исходя из данных. Если это треугольник или прямоугольник все получается нормально а вот если углов больше то уже не получается. Есть размеры углы в цикле я могу изменить координаты всех углов, но не всегда правильно меняет... (считаем что пользователь вводит все правильные размеры)

Добавлено через 7 минут
Проблема я так понимаю в системе координат нужно наверное использовать Методы scale() , translate() ,rotate() и restore() вот это я как раз и не понимаю....
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
16.11.2016, 13:44
serjekat, если бы пользователь задавал только ребра всегда можно было бы построить замкнутый несамопересекающейся даже выпуклый многоугольник. а вот эти "диагонали" которые на самом деле непойми что получается все портят)

Добавлено через 9 минут
serjekat, кажется я понял
давайте код которым вы рисуете
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 14:04  [ТС]
Java
1
2
3
4
5
6
7
8
9
for (int i=3;i<todoPoints.size()+1;i++){
    betta= (Math.pow(todoStoronas.get(i-3).getRazmer(),2)+Math.pow(todoStoronas.get(i-2).getRazmer(),2)-Math.pow(raz,2))/(2*todoStoronas.get(i-3).getRazmer()*todoStoronas.get(i-2).getRazmer());
    betta=Math.acos(betta);
    betta=Math.round((betta * 180) / Math.PI);
    float distance = (float)(cr/todoStoronas.get(0).getRazmer()*razmerAb);
 
    xxx = (float) (todoPoints.get(i-3).getX()+  (distance * Math.cos((betta))));
    yyy = (float) (todoPoints.get(i-3).getY() + (distance * Math.sin((betta))));
}
Добавлено через 4 минуты
distanse расcтояние на canvas от угла betta до следующего угла
todoStoronas.get(0).getRazmer() - размер на canvas первой стороны
razmerAb- размер введенный первой стороны
betta -угол между сторонами
cr-размер введенной диагонали

Добавлено через 47 секунд
todoPoints.size() - кол вершин многоугольника
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
16.11.2016, 14:56
У тебя же есть набор треугольников, у которых две стороны - это стороны многоугольника, и одна сторона - "диагональ". Ты эти треугольники соединяешь через одну точку. То есть есть треугольник АБС и БДЕ, будет фигура АБСДЕ, где Б общая, угол между АБ и БД у тебя известен, значит поворот этого треугольника и положение в пространстве можно определить, вот так и рисуешь, пока последний треугольник не придёт в точку С. При этом не вижу ничего плохого в том, что стороны и диагонали могут пересекаться, когда, например, угол между стороной и диагональю больше, чем угол между этой же стороной и соседней. Диагонали можно сделать немного прозрачными для удобства.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
16.11.2016, 15:12
serjekat, нарисовал я это на бумаге и все там очень печально. не знаю как вы это в 10 строк засунули. видимо какую-то стратегию неведомую мне применяете. на бумаге у меня получается такой пример - есть
-вершина A
-расстояние до B
-расстояние до C
-расстояние до D
-диагональ AD
пытаемся строить ломаную ABCD. если AB + BC + CD < AD то очевидно что это ошибка ибо мы не дотянемся от A до D даже если выложим ребра в линию. этот случай мы не рассматриваем. тогда мы можем КАК УГОДНО вести ломаную. я принимал стратегию что ломаная при прохождении вершины загибается на один и тот же угол с таким расчетом что бы мы пришли в конечную точку. однако, если из вершин которые проходит ломаная выпущены другие диагонали, то как быть с их углами?

Добавлено через 2 минуты
...можно их не трогать и играть только с углами которые выходят за уже построенную часть но это ++доп условий
...а если у нас из одной из внутренних вершин проведена диагональ к другой внутренней вершине это вообще ппц
...а если в одной из вершин финишируют несколько диагоналей %)
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 15:47  [ТС]
код конечно больше. Диагонали изначально нужны что бы высчитать углы, после того как знаешь углы в градусах то диагонали не принципиальны. если к углу приходит несколько диагоналей к примеру 2 то это 3 треугольника и тогда угол будет сумма углов, так же с внутренними углами, расчеты углов в итоге координаты нужно определить зная углы и размеры сторон
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
16.11.2016, 15:52
serjekat, мда.... *вкрадчиво* это, конечно, поздно спрашивать, но что у вас за задача такая странная?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
16.11.2016, 16:19
serjekat,
Цитата Сообщение от serjekat Посмотреть сообщение
Какие есть идеи!?
Я бы сделал так в первом приближении: нарисовал по дефолту равнобедренную фигуру с кол-во сторон, которые ввёл пользователь, затем пущай пользователь меняет по одному любой параметр, при этом будет легко проверить и не давать ему делать то, что геометрически невозможно. При введении им какого-то параметра, ну, скажем, увеличил он одну сторону, а углы (диагонали) оставил как есть, ты растягиваешь/перерисовываешь фигуру, но углы делаешь по своему усмотрению, не нарушая целостности фигуры. Тут вариантов на самом деле много, и все таки попроще, чем у тебя.
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 16:31  [ТС]
Задача не странная, по размерам сделать чертеж. Изначально пользователь динамически сам рисует чертеж, на глаз. А при введении размеров чертеж должен просо с масштабировать все стороны многоугольника.

Добавлено через 56 секунд
Задача именно что бы программа изменила размеры сторон на чертеже а не пользователь.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
16.11.2016, 16:36
Цитата Сообщение от serjekat Посмотреть сообщение
пользователь вводит размеры всех сторон
Цитата Сообщение от serjekat Посмотреть сообщение
программа изменила размеры сторон
Я так не понимаю.
1
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 16:44  [ТС]
Изначально пользователь рисует сам предполагаемый чертеж, затем вводит размеры сторон и программа должна сама с масштабировать стороны чертежа согласно введенным размерам.

Добавлено через 2 минуты
если взять чертеж выше, то тогда он должен перирисоваться так что бы CD стало больше DE уменьшилось и т.д и т.п
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
16.11.2016, 16:44
Сделай как в автокаде, нарисуй сетку, а многоугольник будет, последовательность линий, произвольного либо указанного размера, проводя эти линии, пользователь сам увидит, если они не соединяются.
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 16:46  [ТС]
чертеж выше нарисовал пользователь, затем ввел размеры нужно что бы чертеж стал согласно размерам.
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
16.11.2016, 16:49
serjekat, ну и измени размеры сторон этого рисунка.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
16.11.2016, 16:50
serjekat, если программа сама правит чертеж то просто всегда рисуйте что вам угодно выдавая это за правку ибо алгоритм по которому программа должна будет ранжировать множество условий влияющих на правильность того что мы должны получить непонятен. это как система уравнений которая то ли имеет множество решений то ли не одного
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 17:05  [ТС]
берем просто прямоугольник, если пользователь ввел размеры сторон 100 и диагональ 141 то программа должна начертить квадрат, если диагональ будет меньше или больше то это будет ромб, если стороны прямоугольника будут введены 100 200 100 200 и диагональ 223 то программа должна нарисовать прямоугольник так что бы стороны где 200 были в 2 раза больше чем сторон 100. и тд итп
0
 Аватар для OlegJV
104 / 103 / 29
Регистрация: 13.03.2016
Сообщений: 474
16.11.2016, 17:49
Цитата Сообщение от serjekat Посмотреть сообщение
если пользователь ввел размеры сторон 100 и диагональ 141
А откуда пользователь возьмет число 141? На бумажке посчитает?
0
1570 / 1168 / 426
Регистрация: 08.05.2012
Сообщений: 5,219
16.11.2016, 18:24
Цитата Сообщение от serjekat Посмотреть сообщение
берем просто прямоугольник, если пользователь ввел размеры сторон 100 и диагональ 141 то программа должна начертить квадрат, если диагональ будет меньше или больше то это будет ромб, если стороны прямоугольника будут введены 100 200 100 200 и диагональ 223 то программа должна нарисовать прямоугольник так что бы стороны где 200 были в 2 раза больше чем сторон 100. и тд итп
Делаешь, как я и сказал, рисуешь квадрат в первом случае, любой величины. Во втором случае перерисовываешь фигуру изменив углы между сторонами, в третьем случае перерисовываешь фигуру с двумя удвоенными сторонами (это не обязательно будут 100 или 200, просто нарисуй в два раза больше). Если ты умеешь рисовать эскиз, в чём проблема нарисовать эскиз с подправленными длинами/углами?
0
0 / 0 / 0
Регистрация: 18.02.2016
Сообщений: 25
16.11.2016, 19:02  [ТС]
в прямоугольнике проблем нет, а если углов 10 штук!!! и углы разные острые тупые прямые.... тогда координаты углов у меня не получается вычислить...

откуда пользователь берет данные это его проблемы главное что бы рисовало исходя из его размеров
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2016, 19:02
Помогаю со студенческими работами здесь

Как нарисовать многоугольник
Не могу понять как нарисовать многоугольник. то есть я знаю что надо использовать Graphics я не могу понять как заполнить структуру PointF ?

Как нарисовать правильный многоугольник?
Добрый день. Вроде поню была функция отрисовки правильного многоугольника, но не могу найти (могу ошибаться). Конечно не проблема...

Как нарисовать многоугольник командой DrawPolygon()?
Привет всем. Как мне нарисовать многоугольник в приложении ? Точки не должны задаваться заранее, а их кол-во и координаты(либо рандомно)...

На графике не выводит все точки, в чем ошибки? Как нарисовать по этим точкам многоугольник?
public void RandomSolve() { int i = 0; _X = new double; double nonRundomSolve =...

Нарисовать многоугольник
здравствуйте! Мне надо построить такой многоугольник, а я наугад чертил линии. помогите пожалуйста построить многоугольник. И еще...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru