Страница 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 секунд:
Добавлено спустя 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
				Кирилл писал(а):Понял только последние две програмки.
Так их всего две и есть. 
