Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Графика на Паскале


Автор: Irin 12.11.2006, 21:53
     Помогите пожалуйста! Ответьте на следующие вопросы:

     Можно ли загрузить в Паскале цвета, кроме стандартных(например, использая коды RGB) если да, то как? Можно ли сделать градиентную заливку, и вставить картинки формата JPG(или Gif)?
И можно ли работать одновременно и в графическом, и в текстовом режиме (Т.е. чтобы была красивая заставка с картинкой, пользователь нажимал на кнопки, и ему здесь же рисовался бы график)? 

Заранее благодарна, с уважением, Irin.

Автор: Alexeis 12.11.2006, 22:09
Цитата(Irin @  12.11.2006,  21:53 Найти цитируемый пост)
Можно ли загрузить в Паскале цвета, кроме стандартных(например, использая коды RGB) если да, то как? 

Можно, но при нормальном графическом драйвере  smile . 
Цитата(Irin @  12.11.2006,  21:53 Найти цитируемый пост)
Можно ли сделать градиентную заливку, и вставить картинки формата JPG(или Gif)?

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

Цитата(Irin @  12.11.2006,  21:53 Найти цитируемый пост)
И можно ли работать одновременно и в графическом, и в текстовом режиме (Т.е. чтобы была красивая заставка с картинкой, пользователь нажимал на кнопки, и ему здесь же рисовался бы график)? 


А вот с этим уже никак. Либо то либо другое. 

Вся эта красота требует больших усилий. Это и многое другое проще всего делать под Windows на Delphi. Дос уже практически никем не поддерживается, а потому весьма неудобен как платформа для построения красивых и функциональных программ.

Автор: Irin 12.11.2006, 22:55
Большое спасибо! Только где найти эти декодеры? И как их установить?

Автор: Irin 13.11.2006, 00:51
Да, обидно...  

И еще вопрос про символьные массивы:
Если в задании сказано, что дан массив из литер, ограниченный точкой, то как его считывать? Если через цикл While, то как описывать тип массива? 

Автор: Alexeis 13.11.2006, 01:02
Цитата(Irin @  12.11.2006,  22:55 Найти цитируемый пост)
Только где найти эти декодеры? И как их установить?

А что уже удалось установить режим True Color под дос? Я встречал драйвера VESA, но при попытке установить что-то чуть более менее серьезное чем 640х480х4 выводит частоту моего монитора ниже всяких границ и он просто вырубается. А для JPEG глубина 24бита на пиксель обязательна иначе это будет не Jpeg а какой-то кошмар  smile . От стандартного видеоадаптера можно добиться 320х240х8, что достаточно для GIF, но при таком разрешении никаких графиков не нарисуешь. Тут каждый пиксель не пиксель а квадрат  smile 

Автор: AlexST 13.11.2006, 01:04
Цитата(alexeis1 @  12.11.2006,  22:09 Найти цитируемый пост)
Цитата(Irin @  12.11.2006,  21:53 Найти цитируемый пост)
можно ли работать одновременно и в графическом, и в текстовом режиме (Т.е. чтобы была красивая заставка с картинкой, пользователь нажимал на кнопки, и ему здесь же рисовался бы график)?

А вот с этим уже никак. Либо то либо другое. 
Операторы текстового режима в графическом работают. Но это из сферы приколов. Хотя юзать можно. Ваще конечно текст выводится в графическом режиме спокойно и без приёмов текстового. 

Цитата(Irin @  13.11.2006,  00:51 Найти цитируемый пост)
ограниченный точкой
Поясни это.

Цитата(Irin @  13.11.2006,  00:51 Найти цитируемый пост)
как описывать тип массива
Ну символьный, наверно.  smile 

Автор: Irin 13.11.2006, 01:19
Ну задание такое: Дан текст из цифр, за которыми следует точка. Нужно напечатать его в обратном порядке и указать наиболее часто встречающююся цифру. Мне не совсем понятно, как задавать тип этого массива. Сначала я думала задать его как тип диапазон от символьного от "1" до "9", но так он почему-то работает неправильно. А если задавать просто символьный тип, то проверять после каждого введенного символа цифра он или нет, по-моему не рационально.
   И насчет точки. Если я правильно поняла, имеется в виду, что длина произвольная, и зависит от точки. Но как тогда задавать длину массива, если она заранее не определена? А если считать, что длина определена, то причем тут точка?



Автор: Alexeis 13.11.2006, 01:27
Цитата(AlexST @  13.11.2006,  01:04 Найти цитируемый пост)
Операторы текстового режима в графическом работают. Но это из сферы приколов. Хотя юзать можно. Ваще конечно текст выводится в графическом режиме спокойно и без приёмов текстового. 


Они выполняются (Write, Writeln), но текст не выводят. Текст выводит уже другая графическая функция OutTextXY(); но это вывод текста в графическом режиме, а не совмещение графического и текстового.

Автор: AlexST 13.11.2006, 14:19
Цитата(alexeis1 @  13.11.2006,  01:27 Найти цитируемый пост)
Они выполняются (Write, Writeln), но текст не выводят.
Пардон. Извиняюсь. Немного не точно выразился. ))))) Операторы ввода (Read, Readln) работают с эхом. Вывода конечно ничего не печатают.  smile Это удобно потому, что не надо реализовывать графический ввод, хотя немного коряво.

Цитата(alexeis1 @  13.11.2006,  01:27 Найти цитируемый пост)
это вывод текста в графическом режиме, а не совмещение графического и текстового.
Конечно.

Цитата(Irin @  13.11.2006,  01:19 Найти цитируемый пост)
Сначала я думала задать его как тип диапазон от символьного от "1" до "9", но так он почему-то работает неправильно. А если задавать просто символьный тип, то проверять после каждого введенного символа цифра он или нет, по-моему не рационально.
Влюбом случае надо проверять введённое число. То, что ты задашь значения массива через диапазон ничего тебе не даст. Рационально как раз второе.  smile 

Цитата(Irin @  13.11.2006,  01:19 Найти цитируемый пост)
Но как тогда задавать длину массива, если она заранее не определена? А если считать, что длина определена, то причем тут точка?
 Естесственно это должен быть динамический массив. Хотя здесь главное показать реализацию алгоритма, а не работу с памятью. Для лабы сойдёт тупо задать константную длину строки и работать с ней.

Автор: Irin 13.11.2006, 21:55
    Большое спасибо, вы мне очень помогли. 
И еще вопрос: где можно найти F_Mouse.TPU? В своих папках не нашла. 

Автор: Alexeis 13.11.2006, 22:02
Irin, Это нестандартный модуль. Вообще стандартных модулей для мышки я не встречал, а вот нестандартных пруд пруди. Лично я пользовался модулем мышки из книги Фаронова часть 2. Но в инете полно любых других. 

Автор: Nicholas_S 14.11.2006, 13:33
Irin, могу помочь кое-чем, например, установкой режима от 640x480 до 1024x768 в 65535 цветах. Есть пример готовый с выводом фракталов. Насчет форматов аля JPG, к сожалению, не помогу, не приходилось писать собственноручно.

Автор: Alexeis 14.11.2006, 13:40
Nicholas_S, Давай выкладывай, мне тоже интересно  smile .

Автор: Nicholas_S 14.11.2006, 15:17
alexeis1, обязательно выложу, как доберусь  smile . Суть будет в использовании режима VESA. Возможно, будут некоторые проблемы при обратном переходе из этого режима в Windows (на некоторых видео-карточках), но, в принципе, решаемо.

Автор: Nicholas_S 14.11.2006, 18:16
См. аттачмент.
Файл "coregrph.pas", собственно, есть сам "движок". Позволяет установить 4 режима VESA: 320x240, 640x480, 800x600, 1024x768. Глубина цвета: 65535 цветов, т.е. 16 бит. В модуле есть доп. функции, половина самописные, половина нет. Некоторые, как то окраска пикселей и смешивание цветов, на asm'е. Остальные обычный код.
  Файл "main.pas" - маленький костяк.
  Есть рабочий пример, реализующий рисование фракталов (Жулиа, Мандельброт), "fractals.exe". Вирей нет, код не вредоносный, но страдающим паранойей лучше сразу удалить smile Исходники к exe'шнику не прикладываю, во всяком случае пока, потому как код достаточно большой и находится в нескольких модулях.

Забыл. Irin, есть также самописные модули, которые с пом. которых можно работать с текстом в графическом режиме, т.е. вывод своих знаков, чисел (также верхнего регистра, напр.). Код довольно простой, так что если потребуется - свисти. Может работать как с обычным graph.tpu, так и с vesa, т.е. функции вывода одни и те же.

Автор: Irin 14.11.2006, 22:10
Nicholas_S, огромное спасибо за coregrph.pas.  Если тебе не сложно, выложи, пожалуйста эти самописные модули.   

Автор: Nicholas_S 14.11.2006, 22:50
См. аттачмент.
Файл модуля называется "kgnums.pas" (почему не помню  smile).
Файл "kgalf.pas" - набор "карт" символов с помощью простейшего массива. Размер символов довольно маленький (5x5 px), поэтому при желании можешь доработать.
По умолчанию подключается модуль graph.

Функции:
  1. procedure DrawTxt  (const X, Y : Integer; const Text : String; const Color : Integer; const Anim, Trans : Boolean);
    Рисует текст в заданных координатах заданного цвета.
        Anim - отрисовывать посимвольно с задержкой.
        Trans - прозрачный фон.

  2. function  TxtWidth (const Text : String) : Integer;
    Возвращает ширину строки.

  3. function  TxtHeight (const Text : String) : Integer;
    Возвращает высоту символа (в принципе, бесполезна, т.к. макс. размер заведомо известен, но все-же так "правильнее").

  4. procedure DrawFrameTxt (const X, Y : Integer; const Text : String; const FrameColor, FillColor, TextColor : Integer; const W, H : Integer)
    Рисует текст в заданных координатах заданного цвета, обрамляя рамкой заданного цвета заливки, границы и размеров.

Дерзай.

Автор: Irin 15.11.2006, 18:06
Nicholas_S, Cпасибо. Только ты мог-бы в двух словах рассказать, как ты сделал меню на паскале, и как совместил его с графикой? (в программе про фракталы)

Автор: Nicholas_S 15.11.2006, 18:22
Irin, да, мог бы. Это еще один модуль. smile

Автор: Irin 15.11.2006, 18:26
Nicholas_S, а можно как-нибудь проще более-менее нормальное меню сделать?

Автор: Nicholas_S 15.11.2006, 18:38
Я могу выложить и этот модуль, но  не думаю, что он подойдет, в том плане, что там достаточно много кода, потому как меню универсальное. Мне кажется тебе проще будет написать свою реализацию несложного меню.
  Например, у тебя сейчас есть модуль для вывода текста. Там есть процедура вывода обрамленного текста - используй ее для вывода пунктов меню.  Например (пишу на коленке сейчас, так что ошибки могут быть):

Код

  const menuCnt = 5;

  var selItem: Integer;     {выделенный пункт меню}
        menuItems: Array[1..menuCnt] of String;  {текст пунктов меню}
        key: Char;    {нажатая клавиша}

  procedure DrawMenuItem(itemInd: Byte; isSelected: Boolean);
  begin
    {здесь отрисовываешь элемент меню, использую вывод текста в рамке и учитывая выделен ли элемент, т.е. isSelected=true}
  end;


  procedure DrawMenu();
    var i: Integer;
  begin
    for i:= 1 to menuCnt do
        DrawMenuItem(i, (i=selItem));
    ...
  end;

  procedure ChangeIndex(incr: Byte);
  begin
    DrawMenuItem(itemInd, false);  {перерисовываем старый выделенный элемент}
    Inc(selItem, incr);    {увеличить/уменьшить текущий индекс выделенного элемента меню}

    {далее проверка границ значения индекса выделенного элемента, 
      т.е. напр. если достигнут конец меню и нажата "вниз" - перейти на 1ый пункт}

    DrawMenuItem(itemInd, true);  {перерисовываем новый выделенный элемент}
  end;

  begin
    {инициализация граф. режима}
    selItem := 1;   {выделяем первый элемент}
    DrawMenu();   {рисуем меню}

    repeat
      key := readkey;   {считываем нажатие клавиши...}
      Case key of
        #80 : ChangeIndex(1);        {-Up-}
        #72 : ChangeIndex(-1);       {-Down-}
        #13 : ExecuteAction();          {-Enter-}
    until key=#27;   {...пока не нажата Esc}

    ...
    {выход из графического режима}
  end;



Что-то в этом роде. Экспериментируй.

Автор: Irin 15.11.2006, 18:44
Nicholas_S, Буду пробовать 

Автор: XupyprMV 16.11.2006, 10:57
Я в свой время для нормальной графики юзал TMT Pascal http://www.tmt.com. Там есть такая забавная процедурка:
 
procedure SetSVGAMode(XRes, YRes, BPP, VMode: Word);

Sets SVGA video mode with given resolution and color depth. 

Автор: Nicholas_S 16.11.2006, 12:17
XupyprMV, насколько я понял, он работает минимум с DOS 32-bit, PM. А это уже не 16.  smile 

Автор: Irin 19.11.2006, 17:45
Помогите найти ошибку в коде! (паскаль)
Задача: удалить из матрицы все строки и столбцы, на пересечении которых стоит максимальный элемент. Вот процедура удаления:
Код

procedure udal(A:matrix;f:fnkt{ищет max });
          var i,j,p,q:integer;
          begin
               for i:=1 to n do
                    for j:=1 to m do
                         if a[i,j]=poisk_max(A) then
                         begin
                             for p:=1 to m do
                                  for q:= i to n do
                                  a[q,p]:=a[q+1,p];   
                             n:=n-1
                           {аналогично со столбцом} 
                         end; 
          end;



n-число строк, m-столбцов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)