Рисование окружности в free pascal
Модератор: Модераторы
Рисование окружности в free pascal
При рисовании окружности FPC сильно тормозит. Используется процедура circle(x,y,r); Процессор AMD athlon 2000+, видео Geforce 7300 Gt;
В TP 7 производительность в сотни раз быстрее.
Инцилизация графики идет так:
driver:=detect;
mode:=0;
initgraph(driver,mode,'Путь к модулю graph или просто '').
Кто знает в чем проблема или аналог процедуры circle в FPC.
В TP 7 производительность в сотни раз быстрее.
Инцилизация графики идет так:
driver:=detect;
mode:=0;
initgraph(driver,mode,'Путь к модулю graph или просто '').
Кто знает в чем проблема или аналог процедуры circle в FPC.
Гм... не используйте Graph, лучше GDI. Или сразу OpenGL или DirectX, но аналогами это трудно назвать. 
Кирилл
Ваша проблема здесь:
Detect выдаёт максимально возможный режим работы дравера, а следовательно и максимально ресурсоёмкий. Лучше поставьте какой-нибудь более-менее разумный режим, например:
Скорость хорошая.
Ваша проблема здесь:
driver:=detect;
Detect выдаёт максимально возможный режим работы дравера, а следовательно и максимально ресурсоёмкий. Лучше поставьте какой-нибудь более-менее разумный режим, например:
Код: Выделить всё
gd:=D8bit; //Это цветность
gm:=m1024x768; //Это разрешение экрана
InitGraph(gd, gm, ''); //Не знаю как Вам, а меня вполне удовлетворяет шрифт по умолчанию, поэтому третий параметр пустой
...
Скорость хорошая.
Дож,Vadim,спасибо за советы. попробую.
Vadim т.е можно поставить например Driver:=D2,4,8,16bit ?
и например mode:=m640x480; ?
Кстати почему на вы? Мне 16 лет. так, что можно и проще =)
Дож а как собственно использовать эти самые Gui,OpenGl,directX?
Vadim т.е можно поставить например Driver:=D2,4,8,16bit ?
и например mode:=m640x480; ?
Кстати почему на вы? Мне 16 лет. так, что можно и проще =)
Дож а как собственно использовать эти самые Gui,OpenGl,directX?
На счет GDI ничего посоветовать не могу, так как сам не использовал.
OpenGL или DirectX имеет смысл изучать если потребуется серьезная графика
http://pmg.org.ru/nehe/index.html
http://www.mirgames.ru/articles/directx/dxtutorial.html
OpenGL или DirectX имеет смысл изучать если потребуется серьезная графика
http://pmg.org.ru/nehe/index.html
http://www.mirgames.ru/articles/directx/dxtutorial.html
Создал програмку для рисования только окружностей. Получается примерно по 2 тыщи окружностей в секунду.
GD:=D4bit;
gm:=m640x480;
И еще хотел спросить про такую функция как random, как она в FPC?
Добавлено спустя 14 минут 26 секунд:
Вот собственно и сама програмулина
как не пыхтел в FPC, добиться производительности не получилось =(
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, добиться производительности не получилось =(
Модуль graph судя по всему и использует GDI для отрисовки под Windows. Но видимо как-то кривовато там это реализовано, даже если пользоваться в Лазарусе методами типо Canvas.Arc,Canvas.FillRect и т.д. должно намного быстрее получиться
Вот нашол старую программку-тест на моей старой OpenGL-библиотечке (в аттаче). Там есть функция RenderCircle которая выводит круг средствами OpenGL (строит круг из треугольников- иначе в OpenGL никак) и random там везде используеться. (Сама инициализация OpenGL спрятана внутри длл-ки, но этой инициализации и так в интернете полно..) Зато при разрешении 800*600 и глубине цвета 32 бита в этой демке отрисовываються 25000 полупрозрачных окружностей в секунду (на видеокарте GeForce 5500FX)
Дож а как собственно использовать эти самые Gui,OpenGl,directX?
И еще хотел спросить про такую функция как random, как она в FPC?
Вот нашол старую программку-тест на моей старой OpenGL-библиотечке (в аттаче). Там есть функция RenderCircle которая выводит круг средствами OpenGL (строит круг из треугольников- иначе в OpenGL никак) и random там везде используеться. (Сама инициализация OpenGL спрятана внутри длл-ки, но этой инициализации и так в интернете полно..) Зато при разрешении 800*600 и глубине цвета 32 бита в этой демке отрисовываються 25000 полупрозрачных окружностей в секунду (на видеокарте GeForce 5500FX)
- Вложения
-
- Circles.zip
- (142.45 КБ) 743 скачивания
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Затык тут не с circle(), а с floodfill(), которая в Windows не использует одноименный вызов GDI, а считывает содержимое видеопамяти попиксельно с помощью GetPixel.
Как я понимаю, модуль Graph не позволяет рисовать закрашенные окружности одной процедурой. В качестве выхода (если уж оставаться в рамках graph) видится написание собственной процедуры рисования окружностей путем рисования набора горизонтальных линий нужного цвета.
Ф-ция random в FPC - очень хороша
Как я понимаю, модуль Graph не позволяет рисовать закрашенные окружности одной процедурой. В качестве выхода (если уж оставаться в рамках graph) видится написание собственной процедуры рисования окружностей путем рисования набора горизонтальных линий нужного цвета.
Ф-ция random в FPC - очень хороша
Кирилл писал(а):Vadim т.е можно поставить например Driver:=D2,4,8,16bit ?
Только не все сразу.
Floodfill действительно тормозит. закраска идет от центра к краям горизонтальными линиями.
- Вложения
-
- pack.zip
- Возможно только у меня такие тормоза. Так что выложил файл с исходником.
- (42.11 КБ) 673 скачивания
Кирилл
Я думаю, это тебе больше понравится:
Процедура fillellipse сразу же рисует закрашеный эллипс. А скорость как у Ламборджини.
Добавлено спустя 28 минут 27 секунд:
Типа анимация:
Я думаю, это тебе больше понравится:
Код: Выделить всё
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.
Понял только последние две програмки.
Slep это что то вроде delay?
В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Как используется функция randomize в FPC? например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
Slep это что то вроде delay?
В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Как используется функция randomize в FPC? например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
- bw
- постоялец
- Сообщения: 359
- Зарегистрирован: 01.12.2005 10:36:23
- Откуда: Усть-Илимск
- Контактная информация:
> Slep это что то вроде delay?
Не знаю, что такое Slep. Sleep - да.
> В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Не знаю, что такое fillellise. Для FillEllipse, это координаты и размер прамоугольника в который он должен быть вписан.
> например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
Да. Так получится от 0 до 14 включительно, если не ошибаюсь.
..bw
Не знаю, что такое Slep. Sleep - да.
> В fillellise что значат 300,300,300,300? у эллипса ведь вроде 2 центра.
Не знаю, что такое fillellise. Для FillEllipse, это координаты и размер прамоугольника в который он должен быть вписан.
> например если нужен промежуток от 0 до 15 нужно записать так: X:=random(15);?
Да. Так получится от 0 до 14 включительно, если не ошибаюсь.
..bw
bw спасибо, буду исправляться. 
Кирилл писал(а):Понял только последние две програмки.
Так их всего две и есть.
