Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Анимация(((

Автор: yakudza_m 17.01.2009 4:02

доброго времени суток!!
привет вам из далекой (или не далекой) Беларуси!
у меня проблема: нужно написать на зачет по информатике 2 графические задачи((((

помогите чем сможете...

1. сектор вращается против часовой стрелки и меняет цвета (7 цветов). внутренний угол 30 градусов

2. фигура, состоящая из 2-х кругов с диаметрами D=40 и d=18, движется по горизонтальной поверхности длиной L=180. При достижении стенок на концах поверхности направление движения фигуры меняется...

помогите пожалуйста, не то у меня отберут стипендию(((

Автор: Ozzя 17.01.2009 11:23

1. http://forum.pascal.net.ru/index.php?showtopic=17987&hl=сектор - похожая задача.

2. http://forum.pascal.net.ru/index.php?s=&showtopic=4685&view=findpost&p=38944 - похожая задача.

Автор: yakudza_m 17.01.2009 19:56

круто!!

а как сделать так чтоб сектор менял цвет??

Автор: volvo 17.01.2009 20:47

Цитата
а как сделать так чтоб сектор менял цвет??
Когда-то я делал программу "Поле чудес", так вот чуть-чуть подкорректированный код вращения барабана. По-моему, то, что тебе нужно...
uses crt,graph;

var
gm, gd, x, y: Integer;
ac: ArcCoordsType;

const
numSectors = 12;
EverySector = 360 div numSectors;

Colors: array[1 .. numSectors] of integer =
(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

var
pass, p, T: Integer;

begin
gd := Detect;
InitGraph(gd, gm, '');
if GraphResult <> grOk then begin
WriteLn('Error'); Halt(100)
end;

x := 200; y := 200;
Ellipse(x, y, 0, 360, 103, 103);

repeat

for p := 1 to numSectors do begin
SetColor(DarkGray);
Ellipse(x, y,
Pred(p) * EverySector, p * EverySector, 100, 100);

GetArcCoords(ac);
with ac do begin
Line(x, y, xStart, yStart);
Line(x, y, xEnd, yEnd);

SetFillStyle(SolidFill, colors[p]);

if colors[p] > 0 then begin
inc(colors[p]); if colors[p] > LightGray then colors[p] := 1;
end;

FloodFill( (xStart+xEnd) div 2,
(yStart+yEnd) div 2, DarkGray);
end;
end;
T := colors[numSectors];
move(colors[1], colors[2], pred(numSectors)*sizeof(integer));
Colors[1] := T;

delay(25000);

until keypressed;

ReadLn;
CloseGraph
end.

Автор: yakudza_m 17.01.2009 21:35

клёво!!
но у меня почему-то рисует только 1 сектор синим, а остальные чёрным...

Автор: volvo 17.01.2009 22:21

Цитата
у меня почему-то рисует только 1 сектор синим, а остальные чёрным...
И что потом происходит? Должно начаться вращение цветного сектора с одновременной сменой его цвета. Я проверял у себя, все нормально работает. Чем компилируешь, уточни. Это будет работать только с использованием Турбо Паскаля.

Автор: yakudza_m 17.01.2009 23:49

у меня Free Pascal IDE ...я посмотрел, всё работает, но только оч медленно...как бы мне поменять время задержки???

я еще посмотрел у вас на форуме прогу для любого графика, и хочу спросить, где бы мне вставить функцию SETLINESTYLE и чтоб на картинке были видны координаты на осях?

Автор: renesko1 18.01.2009 3:11

delay(время в милисекундах);
1000 = 1 сек

Автор: volvo 18.01.2009 3:13

Цитата
у меня Free Pascal IDE
Ах, вот оно что... В FreePascal-е очень медленная реализация FloodFill, это не дает программе выполняться так же быстро, как в Турбо Паскале. Все, что могу предложить - это вот такой вот трюк:
uses crt,graph;

var
gm, gd, x, y: Integer;
ac: ArcCoordsType;

const
numSectors = 12;
EverySector = 360 div numSectors;

Colors: array[1 .. numSectors] of integer =
(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

var
pass, p, T: Integer;

begin
gd := d4bit; // уменьшаем число цветов
gm := m640x480; // и размер до обычных размеров VGA

InitGraph(gd, gm, '');
if GraphResult <> grOk then begin
WriteLn('Error'); Halt(100)
end;

x := 200; y := 200;
repeat
setfillstyle(solidfill, black); // затираем прежнее изображение
bar(x - 100, y - 100, x + 100, y + 100);

SetColor(White);
Ellipse(x, y, 0, 360, 103, 103);

for p := 1 to numSectors do begin
SetColor(DarkGray);
Ellipse(x, y,
Pred(p) * EverySector, p * EverySector, 100, 100);

GetArcCoords(ac);
with ac do begin
Line(x, y, xStart, yStart);
Line(x, y, xEnd, yEnd);

if colors[p] > 0 then begin
SetFillStyle(SolidFill, colors[p]); // и рисуем новый цветной сектор
inc(colors[p]); if colors[p] > LightGray then colors[p] := 1;
FloodFill( (xStart+xEnd) div 2,
(yStart+yEnd) div 2, DarkGray);
end;
end;
delay(50);
end;
T := colors[numSectors];
move(colors[1], colors[2], pred(numSectors)*sizeof(integer));
Colors[1] := T;

delay(15);

until keypressed;

ReadLn;
CloseGraph
end.
За счет того, что FloodFill вызывается один раз вместо 12-ти, получается 12-ти кратное ускорение. Но все равно, видно процесс заливки...

Автор: yakudza_m 18.01.2009 4:13

аааааа, жжош, вольво!!!! СПАСИБО БОЛЬШОЕ!!!

прога как ломанулась!!!

а у тя есть какие-нибудь советы по поводу второй проги??