Рисование окружности в free pascal

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Рисование окружности в free pascal

Сообщение Кирилл » 08.02.2009 12:28:28

При рисовании окружности FPC сильно тормозит. Используется процедура circle(x,y,r); Процессор AMD athlon 2000+, видео Geforce 7300 Gt;
В TP 7 производительность в сотни раз быстрее.
Инцилизация графики идет так:
driver:=detect;
mode:=0;
initgraph(driver,mode,'Путь к модулю graph или просто '').
Кто знает в чем проблема или аналог процедуры circle в FPC.
Аватара пользователя
Кирилл
незнакомец
 
Сообщения: 9
Зарегистрирован: 08.02.2009 12:04:22
Откуда: Удмуртия

Re: Рисование окружности в free pascal

Сообщение Дож » 08.02.2009 17:44:33

Гм... не используйте Graph, лучше GDI. Или сразу OpenGL или DirectX, но аналогами это трудно назвать. :)
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Рисование окружности в free pascal

Сообщение Vadim » 08.02.2009 18:36:24

Кирилл
Ваша проблема здесь:
driver:=detect;

Detect выдаёт максимально возможный режим работы дравера, а следовательно и максимально ресурсоёмкий. Лучше поставьте какой-нибудь более-менее разумный режим, например:
Код: Выделить всё
gd:=D8bit; //Это цветность
gm:=m1024x768; //Это разрешение экрана
InitGraph(gd, gm, ''); //Не знаю как Вам, а меня вполне удовлетворяет шрифт по умолчанию, поэтому третий параметр пустой
...

Скорость хорошая.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Рисование окружности в free pascal

Сообщение Кирилл » 08.02.2009 19:44:56

Дож,Vadim,спасибо за советы. попробую.
Vadim т.е можно поставить например Driver:=D2,4,8,16bit ?
и например mode:=m640x480; ?
Кстати почему на вы? Мне 16 лет. так, что можно и проще =)
Дож а как собственно использовать эти самые Gui,OpenGl,directX?
Аватара пользователя
Кирилл
незнакомец
 
Сообщения: 9
Зарегистрирован: 08.02.2009 12:04:22
Откуда: Удмуртия

Re: Рисование окружности в free pascal

Сообщение Дож » 08.02.2009 22:20:30

На счет GDI ничего посоветовать не могу, так как сам не использовал.

OpenGL или DirectX имеет смысл изучать если потребуется серьезная графика
http://pmg.org.ru/nehe/index.html
http://www.mirgames.ru/articles/directx/dxtutorial.html
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Рисование окружности в free pascal

Сообщение Кирилл » 08.02.2009 22:31:19

Создал програмку для рисования только окружностей. Получается примерно по 2 тыщи окружностей в секунду.
GD:=D4bit;
gm:=m640x480;

И еще хотел спросить про такую функция как random, как она в FPC?

Добавлено спустя 14 минут 26 секунд:
Вот собственно и сама програмулина
Код: Выделить всё
Program s1;// под TP 7
uses Crt,graph;
type t=array [1..30] of integer;
var Driver,Mode,c,i,d,col,rad:integer; x1,y1,x,y:t;
procedure pix(Var x1,y1:t);
Var i,n:integer;
begin
For i:=1 to 30 do begin //здесь 30 кол-во шариков;
x1[i]:=random(640);
y1[i]:=random(450);// задаем начальные координаты шаров.
putpixel(x1[i],y1[i],15);
end;end;
procedure Xog(x1,y1:t); // изменяем положение каждого шара.
Var x2,y2,x,y:t;
begin
while not keypressed do begin
For i:=1 to 30    do begin
col:=i mod 14;
rad:=(i mod 3)+2;
setcolor(black);// этим цветом рисуем окружность чтоб убрать предыдущую
setfillstyle(1,black);// устанавливаем режим закраски
circle(x1[i],y1[i],rad);// рисуем саму окружность
floodfill(x1[i],y1[i],black);// закрашиваем ее в черный цвет
x2[i]:=random(13)-6;// задается изменение по оси x
y2[i]:=random(13)-6;//задается изменение по оси у
x[i]:=x1[i]+x2[i];//меням координаты каждого шарика
y[i]:=y1[i]+y2[i];//
setcolor(col);//выбираем его цвет
setfillstyle(1,col);//выбираем стиль закрашивания
circle(x[i],y[i],rad);//рисуем окружность
floodfill(x[i],y[i],col);//закрашиваем ее нужным цветом
x1[i]:=x[i]; y1[i]:=y[i];//сохраняем кординаты точек
end;
delay(100);   задержка//
end;     end;
begin

Driver:=Detect;
InitGraph(Driver,Mode,'');
pix(x1,y1);
Xog(x1,y1);

ReadKey;
closegraph;
end.

как не пыхтел в FPC, добиться производительности не получилось =(
Аватара пользователя
Кирилл
незнакомец
 
Сообщения: 9
Зарегистрирован: 08.02.2009 12:04:22
Откуда: Удмуртия

Re: Рисование окружности в free pascal

Сообщение FedeX » 09.02.2009 02:48:25

Модуль graph судя по всему и использует GDI для отрисовки под Windows. Но видимо как-то кривовато там это реализовано, даже если пользоваться в Лазарусе методами типо Canvas.Arc,Canvas.FillRect и т.д. должно намного быстрее получиться :?

Дож а как собственно использовать эти самые Gui,OpenGl,directX?
И еще хотел спросить про такую функция как random, как она в FPC?

Вот нашол старую программку-тест на моей старой OpenGL-библиотечке (в аттаче). Там есть функция RenderCircle которая выводит круг средствами OpenGL (строит круг из треугольников- иначе в OpenGL никак) и random там везде используеться. (Сама инициализация OpenGL спрятана внутри длл-ки, но этой инициализации и так в интернете полно..) Зато при разрешении 800*600 и глубине цвета 32 бита в этой демке отрисовываються 25000 полупрозрачных окружностей в секунду (на видеокарте GeForce 5500FX)
Вложения
Circles.zip
(142.45 КБ) Скачиваний: 640
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Рисование окружности в free pascal

Сообщение Sergei I. Gorelkin » 09.02.2009 04:22:25

Затык тут не с circle(), а с floodfill(), которая в Windows не использует одноименный вызов GDI, а считывает содержимое видеопамяти попиксельно с помощью GetPixel.

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

Ф-ция random в FPC - очень хороша :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Рисование окружности в free pascal

Сообщение Vadim » 09.02.2009 06:05:04

Кирилл писал(а):Vadim т.е можно поставить например Driver:=D2,4,8,16bit ?

Только не все сразу. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Рисование окружности в free pascal

Сообщение Кирилл » 09.02.2009 08:37:00

Floodfill действительно тормозит. закраска идет от центра к краям горизонтальными линиями.
Вложения
pack.zip
Возможно только у меня такие тормоза. Так что выложил файл с исходником.
(42.11 КБ) Скачиваний: 573
Аватара пользователя
Кирилл
незнакомец
 
Сообщения: 9
Зарегистрирован: 08.02.2009 12:04:22
Откуда: Удмуртия

Re: Рисование окружности в free pascal

Сообщение Vadim » 09.02.2009 10:57:11

Кирилл
Я думаю, это тебе больше понравится:
Код: Выделить всё
program s1;
uses crt,graph;
Var gd,gm: smallint;
   
begin
  Gd:=d4bit;
  Gm:=m800x600;
  initgraph(gd,gm,'');
  setcolor(2);
  setfillstyle(1,2);
  fillellipse(300,300,300,300);

  readkey;
  closegraph;
end.

Процедура fillellipse сразу же рисует закрашеный эллипс. А скорость как у Ламборджини. :)

Добавлено спустя 28 минут 27 секунд:
Типа анимация:
Код: Выделить всё
program s1;
uses Windows,graph;
Var gd,gm, i: smallint;
   
begin
  Gd:=d4bit;
  Gm:=m800x600;
  initgraph(gd,gm,'');
  setcolor(i);
 
  For i:=1 To 15 Do
  Begin
    setfillstyle(1,i);
    fillellipse(300,300,300,300);
    Sleep(500);
  End;
  WriteLn('Трындец! Кино закончилось...');

  closegraph;
end.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Рисование окружности в free pascal

Сообщение Кирилл » 09.02.2009 17:32:09

Понял только последние две програмки.
Slep это что то вроде delay?
В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Как используется функция randomize в FPC? например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
Аватара пользователя
Кирилл
незнакомец
 
Сообщения: 9
Зарегистрирован: 08.02.2009 12:04:22
Откуда: Удмуртия

Re: Рисование окружности в free pascal

Сообщение bw » 09.02.2009 19:18:05

> Slep это что то вроде delay?
Не знаю, что такое Slep. Sleep - да.

> В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Не знаю, что такое fillellise. Для FillEllipse, это координаты и размер прамоугольника в который он должен быть вписан.

> например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
Да. Так получится от 0 до 14 включительно, если не ошибаюсь.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: Рисование окружности в free pascal

Сообщение Кирилл » 09.02.2009 19:30:39

bw спасибо, буду исправляться. :oops:
Аватара пользователя
Кирилл
незнакомец
 
Сообщения: 9
Зарегистрирован: 08.02.2009 12:04:22
Откуда: Удмуртия

Re: Рисование окружности в free pascal

Сообщение Vadim » 10.02.2009 09:39:24

Кирилл писал(а):Понял только последние две програмки.

Так их всего две и есть. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru