IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> ООП и графический редактор
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Уважаемые господа!
Проблема такая - мне было задано за семестр изучить объектно ориентированное программирование и с его помощью написать какой-нибудь графический редактор.
Что такое ООП я, в принципе, изучил (спасибо литературе на этом сайте и на borlpasc.narod.ru) и написал программу, демонстрирующую его особенности (текст прилагается). Но с редактором у меня возникли ряд вопросов, которыя я не могу решить самостоятельно.
1. Для рисования чего бы то ни было мне нужно получать координаты х,у с положения курсора. Теоретически я понимаю что это делается функцией GetX, GetY, но практически так и не въехал, как ее применять. Разъясните, пожалуйста, поподробнее. Если можно, то на примере приложенной программы.
2. Сохранение и откат. Опять таки, теоретически я предполагаю, что сохранение ведется в список (видимо односвязанный), но как?
3. Может быть кто-нибудь что то похожее делал? Если остались исходники каких-нибудь модулей (интерфейс, рисование фигур и вообще все что подходит по теме) скиньте, пожалуйста, мне на почтовый ящик. Только сложностей не надо - я еще не волшебник, я только учусь smile.gif
Вообще редактор, по моему разумению должен получиться простой, без мыши, на hot key's. Типа "ручки-ножки-огуречик".
Заранее благодарен.
Код
Program OPP1;
Uses Crt, Graph;
Var gd,gm:integer;
 Ch: Char;
 S: Boolean;
Const
 Instr = 'УПРАВЛЕНИЕ ДВИЖЕНИЕМ - СТРЕЛКИ, ПЕРЕХОД - END, ВЫХОД - ESC';

Type
 Tp=Object   {объект - точка}
   X,y,c : integer;
   Constructor Init(ax,ay:integer;ac:word);
   Procedure Show; Virtual;
   Procedure Hide; Virtual;
   Procedure Moveto(dx: integer);
 End;

Constructor Tp.Init;
Begin
 X:=ax; y:=ay; c:=ac;
End;

Procedure Tp.Show;
Begin
 Putpixel(x,y,c);
End;

Procedure Tp.Hide;
Begin
 Putpixel(x,y,Getbkcolor)
End;

Procedure Tp.Moveto;
Begin
 repeat
   s:=true;
   Ch := ReadKey;
   Case Ch of
     #27: begin CloseGraph; Halt end;  { выход по клавише ESC }
     #75: begin Hide; X := X-dx end; {изменение координат x, y нажатием стрелок}
     #77: begin Hide; X := X+dx end; {"влево", "вправо", "вверх", "вниз"       }
     #72: begin Hide; Y := Y-dx end;
     #80: begin Hide; Y := Y+dx end;
     #79: S := false; {переход кнопкой END}
   end;
   Show;
 until s = false;
 Hide;
End;

Type
 Tc=Object(Tp)    {объект - круг (наследник)}
   r : integer;
   Constructor Init(ax,ay,ar:integer;ac:word);
   Procedure Show; Virtual;
   Procedure Hide; Virtual;
 End;

Constructor Tc.Init;
Begin
 Inherited Init(ax,ay,ac);  {наследование инициализации}
 R:=ar
End;

Procedure Tc.Show;        {рисование круга}
 Begin
   Setcolor( c );
   Circle(x,y,r);
   SetFillStyle(solidfill, red);
   FloodFill(x,y, red);
 End;

Procedure Tc.Hide;
Begin
 Setcolor(GetBkColor);
 Circle(x,y,r);
 SetFillStyle(solidfill, GetBkColor);
 FloodFill(x,y, GetBkColor);
End;

Var
 T: Tp;
 C: Tc;

Begin
 gd:=detect;
 initgraph(gd,gm,'c:tpbgi');
 SetBkColor(White);
 SetColor(blue);
 Rectangle(50, 425, 600, 460);            {рисование рамки}
 OutTextXY(90, 440, Instr);
 T.Init(125,125,Magenta);      {инициализация 1 объекта}
 T.Show;                       {прорисовка объекта}
 T.MoveTo(15);                 {движение объекта}
 C.Init(125,125,15,red); {инициализация объекта 2}
 C.Show;                  {прорисовка объекта 2}
 While True do begin
   C.Moveto(15);           {движение объекта 2 }
 end;
end.


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


чё-то я себе не больно представляю рисование без мыши?
как это?
или он должен работать так неудобно типа:
выбрал режим - линия, указываешь две точки - нажимаешь ещё что-нить он тебе рисует линию через две точки, выбрал режим круг - указал центр - нажал "нажимаешь ещё что-нить" - нарисовался круг
такой примитив тебе нужен?
а с ООП тебе ещё надо разбираться и разбираться...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Alex'у
Во-первых, мне действительно нужен примитив, т.к. я не в состоянии быстро разобраться с мышом и программами под мыша в Паскале. А для студента-заочника, по непрофильному курсу, хватит и примитива.
Во-вторых, мне еще многов чем разбираться, я и не хвастаю мастерством.
И, в-третьих, а по существу вопроса ты что-нибудь можешь сказать?


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


давай всё по порядку:
  1. Как должна работать программа?
    Потому что без мыши она будет работать по механизму как я описал в предыдущем посте или по пиксельно выводить, то есть юзер "ведёт" курсор по экран и в этих местах выводятся пиксели
  2. Насчёт отката
    Должна ли твоя программа сохранять нарисованное изображение в файл? Число откатов ограниченно? Можно либо сохранять изображения после каждого его изменения в файл, либо в память, либо сохранять информацию о том "как заново нарисовать изображение" (что будет тормозней - этого лучше не делать)
  3. Ну рисовать будешь в цикле, там же будешь реагировать на нажатия клавиш пользователем, смещая курсор вывода
  4. Насчёт ООП
    Объект - есть "сущность" и она НЕ должна зависить от чего-либо. Это самостоятельная единица и писать методы типа MoveTo, который к тому же использует ещё и глобальную переменную S не следует, пиши отдельно методы MoveLeft, MoveRight, MoveUp, MoveDown, а обработка нажатий клавиш будет вестись с основной проге (см. пункт 3)
Ещё хотел сказать на счёт основной части твоего примера: раз ты определяешь
графдрайвер, а вместе с ним и графрежим автоматически (Detect), то использовать
в программе абсолютные координаты не нужно, так как режим может "выставиться" какой угодно и твоя программа будет выводить графику неправильно. Используй GetMaxX, GetMaxY либо выбирай конкретный режим.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Alex'у по порядку:
  1. Программа должна работать, по моему разумению, так:
    При загрузке появляется собственно лист для рисования и сбоку краткое описание - рисовать круг-клавиша, рисовать прямоугольник-клавиша, рисовать линию-клавиша, заливка-клавиша, сохранить-клавиша, выйти-ESC.

    При нажатии на одну из горячих клавиш появляется курсор в центре экрана (или где-нибудь еще) и внизу поясниловка. например, для круга - "выберите центр окружности, нажмите " ", определите диаметр "+" больше, "-" меньше, Enter - оставить так, Esc-убрать". (шаг увеличения/уменьшения равен шагу курсора, забит в переменных и не меняется), начало линии задается клавишей и дальше она рисуется за курсором (LineTo?) и т.д.

    Все фигуры (контуры) рисуются одним цветом, чтобы было проще с заливкой.
  2. Откат, в принципе, не нужен (было задано сделать, если смогу), но итоговое изображение должно сохраняться в файл (и, соответственно, загружаться из файла, при желании).

    Сохранение должно быть векторным. Кстати, а что это такое?
  3. Рисовать само-собой в цикле. Видимо на каждую фигуру свой объект. При этом кто кого будет наследовать, я еще не понял :'(
  4. Насчет отдельных методов - не понял. Я просто содрал программу из исходников, дополнил ее объектами из примеров к лекции по ООП, подкорректировал, как сумел и оно работает. Правда сделать так, чтобы кружочек появлялся там, где пропадает точка у меня не получилось sad.gif (см. выше)


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


лучше б ты на Delphi писал проблем бы заметно поубавилось
кстати щас вроде вся учёба закончилась?(
у меня винт недавно полетел, так что щас Турбо Паскаля нет
пришли мне его по почте(только всё самое необходимое)там "покумекаем"
в архиве зашли
вот мыло ___ALex___@inbox.ru
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






скачать можно тут
                                       http://pascal.dax.ru/?go&id=9
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Интересная тема! Пишите, а мы подкорректируем, если конечно сможем  ;)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


ну чё Паскаль я добыл(
AlaRic
подключайся?  :D
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Я сейчас правда сайтом занят, но постараюсь помочь!  
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


В работе. Делаю наподобие PostScript (основано на стеке) - следовательно, векторное и простой откат любой глубины


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


автор сабжа пропал давно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


...
*****

Группа: Пользователи
Сообщений: 1 347
Пол: Мужской

Репутация: -  3  +


Цитата
автор сабжа пропал давно

Не сказал бы. Кажется у него некоторые трудности: http://pascal.dax.ru/?gb
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Я не пропал, я просто терпеливо жду, когда в обсуждении появится какой-нибудь ответ на какой-либо из моих вопросов.
Мы просто приходим на форум в разное время из за разницы в часовых поясах (весьма большой, кстати) smile.gif


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


Да. И не надо все усложнять. Если подключить мышь, проработать интерфейс, сделать все очень красиво и векторно, то получится что-то вроде http://pascal.hop.ru/Arhives/Edit.zip
Только я не в состоянии понять, как это работает :'(
А я не могу (и не хочу) сдавать то, что я несмогу объяснить.
Стар я уже стал краснеть перед преподавателем, который лет на 10 меня моложе ;)


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


ты по малу спрашивай что нужно!( smile.gif
а то каждый раз на форум заходить...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


а если хочешь хороший интерфейс, то надо писать на Delphi или в какой-нибудь другой визуальной среде с ООП языком
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 42
Пол: Мужской

Репутация: -  0  +


В своем первом сообщении (см.выше) я поставил, по-моему, вполне конкретные вопросы.
Я ведь не прошу написать за меня программу, я постараюсь сделать это сам. Просто в процессе работы столкнулся с трудностями, которые не могу сам разрешить, поэтому обратился на форум.
Я не слишком уж туп, как мне кажется  ;) и вполне смогу сообразить что к чему, если популярно объяснят. Но пока, за 10 дней, ничего по-существу.
Alex, ты меня извини, но по-моему я и так расписал уже, подробней некуда.


--------------------
Все у нас получится!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


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

Зато мы сможешь легко сохранить изображение в файле - точнее то, как его заново нарисовать - будем сохранять координаты квадратиков (в соответствии с выбранным масштабом, он тоже будет храниться в файле) и соответствующие им цвета, так из этого файла мы сможем легко восстановить изображение. И откаты в проге тоже будет легко делать - будем сохранять координаты квадратиков (либо номера, но это щас не суть, в ходе реализации решим) с цветами в динамическом массиве соответственно сможем легко делать откат любой глубины.

Одно осталось в стороне - "Сохранение должно быть векторным" что это значит я точно сам не знаю(с графикой немного работал) но предлагаю на это забить как такой вариант?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 101
Пол: Мужской

Репутация: -  0  +


есть наработки в этой области. может быть кому-нибудь будет интересно...  :)
http://www.sandman.by.ru/pas/src.html


--------------------
Плавают разными стилями, тонут-одним (ц) Кирпичи
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.04.2024 1:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name