Страница 1 из 2
Рисование окружности в 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.
Re: Рисование окружности в free pascal
Добавлено:
08.02.2009 17:44:33
Дож
Гм... не используйте Graph, лучше GDI. Или сразу OpenGL или DirectX, но аналогами это трудно назвать.
Re: Рисование окружности в free pascal
Добавлено:
08.02.2009 18:36:24
Vadim
КириллВаша проблема здесь:
driver:=detect;
Detect выдаёт максимально возможный режим работы дравера, а следовательно и максимально ресурсоёмкий. Лучше поставьте какой-нибудь более-менее разумный режим, например:
- Код: Выделить всё
gd:=D8bit; //Это цветность
gm:=m1024x768; //Это разрешение экрана
InitGraph(gd, gm, ''); //Не знаю как Вам, а меня вполне удовлетворяет шрифт по умолчанию, поэтому третий параметр пустой
...
Скорость хорошая.
Re: Рисование окружности в free pascal
Добавлено:
08.02.2009 19:44:56
Кирилл
Дож,Vadim,спасибо за советы. попробую.
Vadim т.е можно поставить например Driver:=D2,4,8,16bit ?
и например mode:=m640x480; ?
Кстати почему на вы? Мне 16 лет. так, что можно и проще =)
Дож а как собственно использовать эти самые Gui,OpenGl,directX?
Re: Рисование окружности в free pascal
Добавлено:
08.02.2009 22:20:30
Дож
На счет GDI ничего посоветовать не могу, так как сам не использовал.
OpenGL или DirectX имеет смысл изучать если потребуется серьезная графика
http://pmg.org.ru/nehe/index.htmlhttp://www.mirgames.ru/articles/directx/dxtutorial.html
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, добиться производительности не получилось =(
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 02:48:25
FedeX
Модуль graph судя по всему и использует GDI для отрисовки под Windows. Но видимо как-то кривовато там это реализовано, даже если пользоваться в Лазарусе методами типо Canvas.Arc,Canvas.FillRect и т.д. должно намного быстрее получиться
Дож а как собственно использовать эти самые Gui,OpenGl,directX?
И еще хотел спросить про такую функция как random, как она в FPC?
Вот нашол старую программку-тест на моей старой OpenGL-библиотечке (в аттаче). Там есть функция RenderCircle которая выводит круг средствами OpenGL (строит круг из треугольников- иначе в OpenGL никак) и random там везде используеться. (Сама инициализация OpenGL спрятана внутри длл-ки, но этой инициализации и так в интернете полно..) Зато при разрешении 800*600 и глубине цвета 32 бита в этой демке отрисовываються 25000 полупрозрачных окружностей в секунду (на видеокарте GeForce 5500FX)
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 04:22:25
Sergei I. Gorelkin
Затык тут не с circle(), а с floodfill(), которая в Windows не использует одноименный вызов GDI, а считывает содержимое видеопамяти попиксельно с помощью GetPixel.
Как я понимаю, модуль Graph не позволяет рисовать закрашенные окружности одной процедурой. В качестве выхода (если уж оставаться в рамках graph) видится написание собственной процедуры рисования окружностей путем рисования набора горизонтальных линий нужного цвета.
Ф-ция random в FPC - очень хороша
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 06:05:04
Vadim
Кирилл писал(а):Vadim т.е можно поставить например Driver:=D2,4,8,16bit ?
Только не все сразу.
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 08:37:00
Кирилл
Floodfill действительно тормозит. закраска идет от центра к краям горизонтальными линиями.
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 10:57:11
Vadim
КириллЯ думаю, это тебе больше понравится:
- Код: Выделить всё
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.
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 17:32:09
Кирилл
Понял только последние две програмки.
Slep это что то вроде delay?
В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Как используется функция randomize в FPC? например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 19:18:05
bw
> Slep это что то вроде delay?
Не знаю, что такое Slep. Sleep - да.
> В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Не знаю, что такое fillellise. Для FillEllipse, это координаты и размер прамоугольника в который он должен быть вписан.
> например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
Да. Так получится от 0 до 14 включительно, если не ошибаюсь.
..bw
Re: Рисование окружности в free pascal
Добавлено:
09.02.2009 19:30:39
Кирилл
bw спасибо, буду исправляться.
Re: Рисование окружности в free pascal
Добавлено:
10.02.2009 09:39:24
Vadim
Кирилл писал(а):Понял только последние две програмки.
Так их всего две и есть.