21 / 1 / 0
Регистрация: 21.01.2020
Сообщений: 57

Рисование правильных многоугольников

18.01.2022, 13:47. Показов 1498. Ответов 0

Студворк — интернет-сервис помощи студентам
Дорогие товарищи-форумчане требуется ваша помощь.
Суть в том чтобы написать программу чтобы строить многоугольники мышкой, с этой задачей я разобрался и всё реализовал.
Но все бы ничего, нужно реализовать несколько исключений: отсутствие самопересечений(линии многоугольника не должны пересекаться); один многоугольник не должен пересекать другой многоугольник; нельзя рисовать многоугольник внутри другого многоугольника.
Можно сделать так чтобы нельзя было просто ставить точку, либо можно выводить на экран ошибку, разницы нет.
Может кто знает как это реализовать и сможет помочь...

Прикрепляю исходный код.

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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <FL/Fl_Double_Window.H>
#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Button.H>
#include <stdio.h>
int Npoly=0, Ncur=0;
int Xpoly[20][100], Ypoly[20][100], Spoly[20];
int inpoly(int N, int x, int y)
{
  for (int i=0; i<Spoly[N]; i++)  
;
 
}
class EventWindow: public Fl_Double_Window
{
        private:
                int handle_mouse(int event, int button, int x, int y);
        public:
                EventWindow(int width, int height);
                int handle(int e);
};
char * foo;
int first=1, X0, Y0, X, Y, XF, YF;
EventWindow::EventWindow(int width, int height)
:Fl_Double_Window(width, height, "")
{      
        label("Demo Window ");
}
 
int EventWindow::handle(int event)
{
        switch (event) {
                        case FL_PUSH:
                        case FL_RELEASE:
                        case FL_DRAG:
                        case FL_MOVE:
             return handle_mouse(event,Fl::event_button(),
                 Fl::event_x(),Fl::event_y());          
                        case FL_FOCUS:
                                        return 1;
                        case FL_UNFOCUS:
                                        return 1;
                        default:
                                        return Fl_Window::handle(event);
        };
}
 
int EventWindow::handle_mouse
     (int event, int button, int x, int y) 
{
        if (foo) delete [] foo;
        foo = new char[100];
    int ret = 0;
   X=x; Y=y;
    switch ( button ) {
               case 1: // LMB
                       ret = 1;
                        if ( event == FL_PUSH ) {
                     if (first) {
                        XF = X0 = x; YF = Y0 = y; first=0;
 
                       }
                      else {
                       fl_line(x,y,X0,Y0);
                          X0=x; Y0=y;
                        };
                        printf("LMB PUSH ( %d , %d )\n",x,y); fflush(stdout);
;
                        }
                       else if ( event == FL_RELEASE ) {
                       fl_color(FL_BLACK);
                       fl_line(x,y,X0,Y0);
                          X0=x; Y0=y;
 
                                        }
                                        break;
                  case 2: // MMB
                           ret = 1;
                           if ( event == FL_PUSH ) {
                             printf("MMB Push ( %d , %d )\n",x,y); fflush(stdout);
                           }
                           else if (event == FL_DRAG ) {
                             printf("MMB Drag ( %d , %d )\n",x,y); fflush(stdout);
                           }
 
                           else if ( event == FL_RELEASE ) {
                              printf("MMB Release ( %d , %d )\n",x,y); fflush(stdout);
                        }
                        break;
                 case 3: // RMB
                          ret = 1;  first=1;
                          if ( event == FL_PUSH ) {
                                          printf("RMB Push ( %d , %d )\n",x,y); fflush(stdout);
                       fl_line(XF,YF,X0,Y0);
                          }
                          else if (event == FL_DRAG ) {
                              printf("RMB Drag ( %d , %d )\n",x,y); fflush(stdout);
                          }
                          else if ( event == FL_RELEASE ) {
                                          printf("RMB Release ( %d , %d )\n",x,y);
fflush(stdout);
                            }
                            break;
                     }
     return ret;
}
 
 
class DrawX : public Fl_Widget {
public:
    DrawX(int X, int Y, int W, int H, const char*L=0) : Fl_Widget(X,Y,W,H,L)
     {
     }
    void draw() {
                  fl_color(FL_BLACK);
                }
};
 
int main() 
{
 Npoly=Ncur=0;
   EventWindow b(800, 800);
  DrawX draw_x(0, 0, b.w(), b.h());
  b.resizable(draw_x);
  b.show();
  return(Fl::run());
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.01.2022, 13:47
Ответы с готовыми решениями:

FLTK построение правильных многоугольников
Привет всем! Кто может пояснить такую вещь: Вот задание: Определите класс Regular_polygon. В качестве аргументов конструктора...

Проверить лежит ли один из многоугольников строго внутри другого и определить площади многоугольников
Два выпуклых многоугольника заданы на плоскости перечислением координат вершин в порядке обхода границы. Проверить лежит ли один из них...

Двенадцать правильных многоугольников
Двенадцать правильных многоугольников с заданным числом сторон, заданы координаты двух вершин одной грани первого многоугольника, каждый...

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

Уравнение правильных многоугольников в полярных координатах
Многоугольник является выпуклым, если никакая сторона многоугольника, будучи неограниченно продолженной, не делит многоугольник на две...

Рисование многоугольников
Осуществить вывод на экран сцены, состоящей из 10 многоугольников, случайным образом расположенных на графическом экране. Генерируем...

Подсчет правильных и не правильных ответов
Есть счетчик, который считает количество баллов, правильный ответ на вопрос +1 балл, всего вопросов 24. Как мне можно модифицировать код,...

Создание многоугольников
Доброго времени суток, прошу помощи. Как сделать так, чтобы при нажатии правой кнопки мыши удалялся создаваемый мною кружок? Помогите,...

пересечение многоугольников
у кого то была тема объединения многоугольников, я там отписывал ено никто не ответил, нужно объединить 2 массива точек Point в один с...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru