Помощь - Поиск - Пользователи - Календарь
Полная версия: Воспроизведения рисунка
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
plafon
Кто нибудь поможет с такой задачей

Написать программу для воспроизведения рисунка, записанного в специальном формате в файле с расширением “vec”. Рисунок поместить в центр экрана. Под рисунком вывести имя файла, включая путь.
Графическое изображение представляет собой набор графических примитивов: точек, отрезков, прямоугольников и эллипсов различных цветов. Прямоугольники и эллипсы могут иметь заливку. Изображение имеет 16 цветов (коды цветов 0-15).
Файл содержит записи, каждая из которых состоит из фиксированного набора полей, описывающих графический примитив. Все координаты указываются в пикселях относительно левого верхнего угла изображения, имеющего координаты (0,0). Оси направлены: 0X - вправо, 0Y - вниз. Графические примитивы отображаются относительно текущей позиции курсора, которая может быть изменена специальной командой
BlackShadow
По-подробнее о записи с фиксированным набором полей, пожалуйста.
plafon
Формат записи:
1. Поле Operation типа Byte. Содержит код операции в соответствии с Табл.1.
2. Поле X типа Integer. Содержит значение координаты по оси X.
3. Поле Y типа Integer. Содержит значение координаты по оси Y.
4. Поле Color типа Byte. Поле содержит цвет графического примитива. Это битовое поле, т.е. в нем имеют значение отдельные биты и группы битов. Обычно биты нумеруются с нуля (младший бит). Бит считается установленным, если содержит 1, и сброшенным (не установленным), если содержит 0. Для выделения нужной группы битов используют битовые маски и операцию логического умножения AND, а также операции логического сдвига вправо (SHR) и влево (SHL).


Таблица 1. Содержимое поля Operation.
Код операции
0

1

2
3

4

5

6


Вид операции
Запись содержит указание размера рисунка в пикселях (в полях X и Y). Если 7 бит поля Color установлен, то рисунок имеет заливку фона, код цвета которого указан в битах 0-3.
Указание позиции курсора (X,Y) относительно левого верхнего угла рисунка. Поле Color не несет полезной информации.
Рисование пикселя в позиции (X,Y). Цвет пикселя задан в младших 4-х битах (0-3) поля Color.
Рисование отрезка из текущей позиции курсора в точку (X,Y). Цвет задан в битах 0-3 поля Color. Позиция курсора изменяется на (X,Y).
Рисование прямоугольника, два диагональных угла которого заданы текущей позицией курсора и точкой (X,Y). Цвет задан в битах (0-3) поля Color. Признак заливки - бит 7 установлен в 1.
Рисование эллипса с центром в текущей позиции курсора, и радиусами, заданными в полях X и Y. Цвет задан в битах (0-3) поля Color. Признак заливки - бит 7 установлен в 1.
Заливка области, ограниченной контуром, начиная с точки (X,Y). Цвет контура задан в битах 0-3, а цвет заливки - в битах 4-7 поля Color.

Примечания:
1. Запись с кодом 0 является первой и единственной в файле.
2. Позиция курсора изменяется на (X,Y) только в операциях с кодами 1 и
BlackShadow
Бред-бредом.
Пишу без компилятора и по памяти, так что возможны ошибки.Если что - свисти, исправлю.
Код

Uses Graph,Crt;

Type
 TRec=Record
   Code:Byte;
   x:Integer;
   y:Integer;
   Color:Byte
 End;

Procedure DisplayFile(FileName:String);
Var
 f:File Of TRec;
 r:TRec;
Begin
 Assign(f,FileName);
 Reset(f);
 MoveTo(0,0);
 While Not Eof(f) Do
 Begin
   Read(f,r);
   Case r.Code Of
     0:
       If (r.Color And $80) <> 0 Then
       Begin
         SetBackColor(r.Color And $0F);
         ClearViewPort
       End
     1:
       MoveTo(r.x,r.y);
     2:
       PutPixel(r.x,r.y,r.Color And $0F);
     3:
     Begin
       SetColor(r.Color And $0F);
       LineTo(r.x,r.y)
     End;
     4:
       If (r.Color And $80) <> 0 Then
       Begin
         SetFillStyle(SolidFill,r.Color And %0F);
         Bar(GetX,GetY,r.x,r.y)
       End
       Else
       Begin
         SetColor(r.color And $0F);
         Rectnagle(GetX,GetY,r.x,r.y)
       End;
     5:
       If (r.Color And $80) <> 0 Then
       Begin
         SetFillStyle(SolidFill,r.Color And $0F);
         FillEllipse(GetX,GetY,r.x,r.y)
       End
       Else
       Begin
         SetColor(r.Color And $0F);
         Ellipse(GetX,GetY,r.x,r.y);                  {Вот тут вроде ещё углы начала и
                                                       конца указать надо, но я точно не помню}
       End;
     6:
     Begin
       SetFillStyle(SolidFill,r.Color Shr 4);
       FloodFill(x,y,r.Color And $0F)
     End
 End;
 Close(f)
End;

Var
 r,m:Integer;
 s:String;

Begin
 Write('Enter FileName: ');
 ReadLn(s);
 r:=Detect;
 InitGraph(r,m,'');
 DisplayFile(s);
 ReadKey;
 RestoreCRTMode
End.


Приблизительно так, но я не уверен, что всё верно, т. к. Graph.Tpu не кастовал года уж как 2-3... Если что, то спрашивай, тут на такие вопросы ответят точно.
plafon
Пацаны посмотрите а то чё то не получается а завтра зачёт помогите пожалуйста
Dark
Код

Uses Graph,Crt;

Type
TRec=Record
  Code:Byte;
  x:Integer;
  y:Integer;
  Color:Byte
End;

Procedure DisplayFile(FileName:String);
Var
f:File Of TRec;
r:TRec;
Begin
Assign(f,FileName);
Reset(f);
MoveTo(0,0);
While Not Eof(f) Do
Begin
  Read(f,r);
  Case r.Code Of
    0:
      If (r.Color And $80) <> 0 Then
      Begin
        SetBkColor(r.Color And $0F);
        ClearViewPort
      End;
    1:
      MoveTo(r.x,r.y);
    2:
      PutPixel(r.x,r.y,r.Color And $0F);
    3:
    Begin
      SetColor(r.Color And $0F);
      LineTo(r.x,r.y)
    End;
    4:
      If (r.Color And $80) <> 0 Then
      Begin
        SetFillStyle(SolidFill,r.Color And $0F);
        Bar(GetX,GetY,r.x,r.y)
      End
      Else
      Begin
        SetColor(r.color And $0F);
        Rectangle(GetX,GetY,r.x,r.y)
      End;
    5:
      If (r.Color And $80) <> 0 Then
      Begin
        SetFillStyle(SolidFill,r.Color And $0F);
        FillEllipse(GetX,GetY,r.x,r.y)
      End
      Else
      Begin
        SetColor(r.Color And $0F);
        Ellipse(GetX,GetY,r.x,r.y,0,360);                  {Вот тут вроде ещё углы начала и
                                                      конца указать надо, но я точно не помню}
      End;
    6:
    Begin
      SetFillStyle(SolidFill,r.Color Shr 4);
      FloodFill(r.x,r.y,r.Color And $0F)
    End
End;
Close(f)
End;
end;

Var
r,m:Integer;
s:String;

Begin
Write('Enter FileName: ');
ReadLn(s);
r:=Detect;
InitGraph(r,m,'');
DisplayFile(s);
ReadKey;
RestoreCRTMode
End.
plafon
Dark зачем же повторять за BlackShadow ведь я же говорю что что то не выходит с этим кодом и ещё прошу всех БЫВАЛЫХ помогите пожалуйста ведь вы же всё знаете
huh.gif
Altair
А что конкретно не получается?
Я не стал проверять весь код, просто мельком просмотрел и пробовал компилить. Синтаксических ошибок нет.
Вот список причин, по которым может не оаботать программа:
1. вы не правильно делаете файл с расширением vec
2. у вас нет графического драйвера
3. вы не указываете путь к файлу, а только имя
4. у вас старый модуль CRT (error 200)

Уточните, что к вас не работает?
Цитата
Dark зачем же повторять за BlackShadow

Я тоже не понял этого.
plafon
Всё нормально но после всего пишется File not found
Путь указываю верно
plafon
Как прикрепить файл с расширением vec чтобы проверили?
plafon
Извиняюсь там было написано File not open
rolleyes.gif
Dark
Я просто исправил мелкие баги... хм...
Altair
Цитата
Извиняюсь там было написано File not open

Тогда открой его, и дело с концом.
plafon
Непонял как его открыть?
BlackShadow
Убедись, что не посеял строку Reset(f) После Assign(f,FileName).
plafon
Проверил всё на месте
BlackShadow
Странно... Перепроверю потом.
Altair
Действительно странный глюк. Надо попробовать вырезать все из процедуры и вставить в код. Она не нужна все-равно.
И поместить открытие файла перед инициализацией граф режима.
plafon
Пацаны я вас умоляю помогите срочняк нужно а?
Altair
ОК, присоедини тестовый файл vec , а то самому не хочется его писать.
Тем более, что он типизированный.
Любимая
Люди помогите плииииз. Нужно составить рисунок в паскале, ну и ессно дело алгоритм к нему, Помогите чем сможете! huh.gif Рисунок моно любой, моно какой-нить примитив, неважно.
volvo
Любимая
1. Зачем поднимать старые темы? Нельзя создать новую?
2. Правила (п.4)
Цитата
Прежде чем задавать вопрос ... воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!

А ведь таких задач решалось немало...

Например, эта...
Любимая :nono:
уж простите "чайника" за такую ошибочку, похоже мне не на ваш сайтик надо было, не все такие умные как вы))))))
GoodWind
Цитата
похоже мне не на ваш сайтик надо было,

почему не на наш ? на наш !!! :yes: просто правила созданы, чтобы их читали...
Guest
просто я всю жизнь в бейсике проработала, а тут срочно надо паскаль, это ужасно, я паскаль в жизни в глаза не видела
GoodWind
Цитата
просто я всю жизнь в бейсике проработала, а тут срочно надо паскаль

оффтоп: а чё так сразу ? blink.gif

какой примитив ? дайте поточнее, набросаю сейчас.....
ну нету у меня воображения lol.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.