Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2022, 16:06   #1
chopperis
Новичок
Джуниор
 
Регистрация: 23.01.2022
Сообщений: 1
По умолчанию Рисование правильных многоугольников FLTK

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

Прикрепляю исходный код.
Код:
#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());
}
chopperis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP БД подсчет правильных и не правильных ответов в тесте beginner@ PHP 6 14.05.2014 11:18
FLTK закрытие окна 220Volt Общие вопросы C/C++ 2 07.01.2014 15:40
Сборка FLTK в Windows 220Volt Софт 5 29.11.2013 04:41
OpenGl рисование многоугольников. CWD Помощь студентам 2 21.09.2010 02:56