IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Псевдографика, построение человечка,анимация конечностей
bakalava92
сообщение 19.10.2009 9:31
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской
Реальное имя: Никита

Репутация: -  0  +


Добрый день! Нужна помощь в решении такой задачи: Построить движущегося вправо,влево.. человечка с анимированными конечностями с помощью псевдографики, с использованием собственных процедур, никаких модулей кроме CRT использовать нельзя. Собственно не могу сделать руки, получается либо сделать их подвижными по оси Y, но по оси X они не двигаются, либо наоборот

Код для построения человечка написал:

uses CRT;
var
g,i:integer;


procedure circle(Radius,Horizontal,Vertical:integer);
var
l,x,y:integer;
begin
for l:=0 to 360 do
begin
x:=round(Radius*sin(l)+Horizontal);
y:=round(Radius*cos(l)+Vertical);
GoToXY(x,y);
write('*');
end
end;


procedure HorizontalLine(y,b1,b2:integer);
begin
for g:=b1 to b2 do
begin
GoToXY(g,y);
writeln('*');
end
end;


procedure VerticalLine(x,b1,b2:integer);
begin
for g:=b1 to b2 do
begin
GoToXY(x,g);
writeln('*');
end
end;


begin
clrscr;
for i:=1 to 60 do
begin
textcolor(red);

Circle(3,15+i,4); {golova}

Circle(1,19+i,11); {pugovica1}
Circle(1,19+i,14); {pugovica2}

HorizontalLine(9,8+i,22+i); {tulovishe}
HorizontalLine(16,8+i,22+i);

VerticalLine(8+i,10,15); {tulovishe}
VerticalLine(22+i,10,15);
VerticalLine(15+i,9,15);

VerticalLine(15+i,8,14); {sheya}

VerticalLine(15+i,17,22); {nogi}
VerticalLine(11+i,17,22);
VerticalLine(19+i,17,22);
VerticalLine(17+i,22,24);
VerticalLine(13+i,22,24);

HorizontalLine(22,11+i,19+i);


delay(50000);

textcolor(black);

Circle(3,15+i,4); {golova}

Circle(1,19+i,11); {pugovica1}
Circle(1,19+i,14); {pugovica2}

HorizontalLine(9,8+i,22+i); {tulovishe}
HorizontalLine(16,8+i,22+i);

VerticalLine(8+i,10,15); {tulovishe}
VerticalLine(22+i,10,15);
VerticalLine(15+i,9,15);

VerticalLine(15+i,6,14); {sheya}

VerticalLine(15+i,17,22); {nogi}
VerticalLine(11+i,17,22);
VerticalLine(19+i,17,22);
VerticalLine(17+i,22,24);
VerticalLine(13+i,22,24);

HorizontalLine(22,11+i,19+i);

end;
readln
end.

--------------------------------------------------------------------------
Помогите пожалуйста приклеить к нему руки+еще чтобы двигались вправо и вверх вниз, вообщем что руками махал)) сам похоже уже не справлюсь mega_chok.gif

Тегами для подсветки кода пользуйся...

Сообщение отредактировано: volvo - 19.10.2009 14:08
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
ammaximus
сообщение 21.10.2009 14:14
Сообщение #2


Ночной волк
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской

Репутация: -  1  +


1. достаточно просто написать
until keypressed


2. Где repeat?

3. Вот рисую линии с помощью алгоритма Брезенхема:
uses crt;
var
i:integer;

procedure line(x0,y0,x1,y1:integer);
var
x,y:integer;
begin
if (x0=x1) then
begin
{func goriz - ТВОЯ ФУНКЦИЯ ГОРИЗОНАЛЬНОЙ ЛИНИИ}
exit;
end;
if (y0=y1) then
begin
{func vert - ВЕРТИКАЛЬНОЙ}
exit;
end;

{РИСУЕМ}
for x:=x0 downto x1 do
begin
GotoXY(x,round ( ((y1-y0) / (x1-x0)) * (x-x0)+y0));
write('*');
end;

for y:=y0 downto y1 do
begin
GotoXY(round ( ((y-y0) / (y1-y0)) * (x1-x0)+x0), y);
write('*');
end;

for x:=x0 to x1 do
begin
GotoXY(x,round ( ((y1-y0) / (x1-x0)) * (x-x0)+y0));
write('*');
end;

for y:=y0 to y1 do
begin
GotoXY(round ( ((y-y0) / (y1-y0)) * (x1-x0)+x0), y);
write('*');
end;

end;



begin
clrscr;
line(10,10,11,20);
line(10,10,25,14);
line(10,10,2,2);
line(10,10,15,3);
line(10,10,3,15);
readkey;

end.


Я не стал писать конструкции if в построении, неверные ситуации итак игнорируются. Рисует во все стороны.


--------------------
Не думай о белой обезьяне.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 21.10.2009 18:34
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Цитата(ammaximus @ 21.10.2009 15:14) *
3. Вот рисую линии с помощью алгоритма Брезенхема:
В алгоритме Брезенхема не используются ни числа с плавающей точкой, ни операция округления, ни операции деления внутри цикла.
Это вас кто-то обманул.
Procedure Line(x1,y1,x2,y2,c:Integer);
var dx,dy,sx,sy,d,d1,d2,x,y,i:Integer;
begin
dx:=abs(x2-x1);
dy:=abs(y2-y1);
if (x2>x1) then sx:=1 else sx:=-1;
if (y2>y1) then sy:=1 else sy:=-1;
if dy<=dx then
begin
d:=dy shl 1 - dx;
d1:=dy shl 1;
d2:=(dy-dx) shl 1;
PutPixel(x1,y1,c);
x:=x1+sx;y:=y1;
for i:=1 to dx do
begin
if (d>0) then begin inc(d,d2);inc(y,sy); end
else inc(d,d1);
PutPixel(x,y,c);
inc(x,sx);
end;
end else
begin
d:=dx shl 1 - dy;
d1:=dx shl 1;
d2:=(dx-dy) shl 1;
PutPixel(x1,y1,c);
y:=y1+sy;x:=x1;
for i:=1 to dy do
begin
if (d>0) then begin inc(d,d2);inc(x,sx); end
else inc(d,d1);
PutPixel(x,y,c);
inc(y,sy);
end;
end;
end;




Сообщение отредактировано: andriano - 21.10.2009 18:48
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 14:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"